面向对象的基础语法
python中对象无处不在,变量、数据、函数都是对象。
要验证一个标识符是不是对象有两种方法:
1,在标识符/数据后面输入一个 “.
”,然后按下tab键,iPython会提示该对象能够调用的方法列表。
2,使用内置函数dir
传入标识符/数据,可以查看对象内的所有属性及方法。
__name__
格式的方法是python提供的内置方法/属性。
方法名 | 作用 |
---|---|
__new__ | 创建对象时,会被自动调用 |
__init__ | 对象初始化时,会被自动调用 |
__del__ | 对象被从内存中销毁前,会被自动调用 |
__str__ | 返回对象的描述信息,print函数输出使用 |
定义类
面向对象是更大的封装,在一个类中封装多个方法,这样通过这个类创建出来的对象,就可以直接调用这些方法了。
class 类名:
def 方法1(self, 参数列表):
pass
def 方法2(self, 参数列表):
pass
方法的定义格式和函数几乎一样,区别在于,方法的第一个参数必须是self
类名的命名规则要符合大驼峰命名法
创建对象
当一个类定义完成之后,就可以用这个类来创建对象了。因为还没学定义属性,所以这里的名字属性直接用方法的形参进行传递,有点别扭。
对象变量 = 类名()
class Cat:
def eat(self, name):
print("小猫的名字叫%s" % name)
tom = Cat()
tom.eat("TOM")
print(tom)
小猫的名字叫TOM
<__main__.Cat object at 0x000001F4B1249C48>
在面向对象开发中,引用的概念同样适用。
在python中使用类创建对象之后,变量中记录的是对象在内存中的地址,也就是变量引用了新建的对象。使用print
输出对象变量,默认情况下能够输出这个变量引用的对象是由哪一个类创建的对象,以及在内存中的地址(十六进制)。
%d
可以以10进制输出数字
%x
可以以16进制输出数字
addr = id(tom)
print("%d" % addr)
print("%x" % addr)
不推荐在类外部直接给对象增加属性:
在类的外部,可以直接给对象增加属性,只需要通过.
利用赋值语句即可.
tom.gender = "female"
lazy_cat.gender = "male"
但是这种方法不推荐,因为对象的属性应该封装在类的内部。
方法的第一个参数是self
,可以通过self.
访问对象的属性。
哪一个对象调用的方法,self
就是哪一个对象的引用。
在调用方法时,不需要传递self参数,因为对象在调用方法时,把自己传递给self
了。在定义方法时,第一个参数必须是self
。
初始化方法
当使用类名()
创建对象时,会自动执行以下操作:
1,为对象在内存中分配空间----创建对象
2,为对象的属性设置初始值----初始化方法__init__
__init__
方法是专门用来定义一个类具有哪些属性的方法。
在初始化方法__init__
内部使用self.属性名 = 属性的初始值
就可以定义属性。
定义属性之后,再使用Cat
类创建对象,都会拥有该属性。
class Cat:
def __init__(self):
self.name = "Tom"
def eat(self):
print("%s 爱吃鱼" % self.name)
tom = Cat()
tom.eat()
通过改造初始化方法__init__
,给初始化方法传入形参,可以实现在创建对象时,把对象的一些特有的属性以实参的方式传递到初始化方法内部。在创建对象时,应该对应的传入实参。
class Cat:
def __init__(self,name):
self.name = name
def eat(self):
print("%s 爱吃鱼" % self.name)
tom = Cat("Tom")
lazy_cat = Cat("懒猫")
tom.eat()
lazy_cat.eat()
其他的一些内置方法:
和__init__
方法对应的__del__
方法。
__del__
方法:如果希望在对象被销毁前,再做一些事情,可以考虑一下__del__
方法。
一个对象从调用 类名()
创建,生命周期开始,到 __del__
方法被调用,生命周期结束。
def __del__(self):
print("%s 去世了" % self.name)
这个方法不需要主动调用,系统在收回对象的时候自动调用。并且,tom这个对象是全局变量,只有在整个程序运行完毕之后,才会被自动调用因此Tom去世了
会打印在程序的最后。如果想要提前调用,收回对象,可以使用del
关键字。
使用del
关键字可以删除对象。
del tom
当代码中出现上述代码时,系统就会提前调用__del__
方法,提前收回tom
这个对象,这样Tom去世了
打印的位置就和 del tom
在程序中的位置有关了。
__str__
方法
在python中,使用print
输出对象变量,默认情况下,会输出这个变量引用的对象 是 由哪一个类创建的对象以及在内存中的的地址(十六进制表示)。如果希望使用print输出对象变量时,能够打印自定义的内容,就可以利用__str__
这个内置方法了。
在使用__str__
方法时,必须返回一个字符串。
class Cat:
def __init__(self, new_name):
self.name = new_name
print("%s 来了" % self.name")
def __str__(self):
return "我是小猫:%s" % self.name
tom = Cat("Tom")
print(tom)
最后提一句,print(tom.name)
打印出来的值,是创建对象时传入的属性值Tom
。