本篇在《Python 面向对象(1)》基础上,对面向对象的构造函数、self是什么、析构函数、重写函数等内容进行讲解以及相关示例。
目录
__init__() 在使用类创造对象的时候自动调用
注意:如果不显示的设置构造函数,则默认会创造一个空的构造函数。
之前访问属性时还需要在实例化后,对对象属性进行赋值,
我希望在实例化对象后就拥有可以使用的属性,并且每个对象属性不同;
这可以使用构造函数实现,在实例化时就赋予它属性。
示例如下:
class Person(object):
def run(self):
print('跑步')
def eat(self, food):
print('吃%s' % food)
def look(self, name):
print('看%s' % name)
def __init__(self, name, age, gender, height, weight):
print('这里是init,开始赋值')
self.name = name
self.age = age
self.gender = gender
self.height = height
self.weight = weight
可以看到最后增加了一个__init__的方法,它的参数有名称、年龄、性别、身高和体重。
并且去掉了原来类中的这些属性,也不会影响到构造函数为其赋值。
接下来开始实例化person类,并为其设置属性,这时候person的小括号里面就必须传参了,参数就是构造函数中设置的参数和顺序(除self外)。
示例如下:
p1 = Person('张三', 18, '男', 180, 80)
# 打印名称和年龄
print(p1.name, p1.age)
p2 = Person('李四', 18, '女', 165, 55)
# 打印名称和年龄
print(p2.name, p2.age)
# 执行结果
# 这里是init,开始赋值
# 张三 18
# 这里是init,开始赋值
# 李四 18
可以看到实例化都是首先执行构造函数去赋值,然后返回了张三和李四两个对象的名称和年龄,这就是构造函数。
self代表类的实例,而非类
哪个对象调用方法,那么该方法中的self就代表那个对象
self.__class__代表类名。
在原来类的基础上增加了一个介绍方法,来进行自我介绍。
示例如下:
class Person(object):
def run(self):
print('跑步')
def eat(self, food):
print('吃%s' % food)
def look(self, name):
print('看%s' % name)
def desc(self):
print('你好,我的名字是%s,我的身高是%dcm!' % (self.name, self.height))
def __init__(self, name, age, gender, height, weight):
self.name = name
self.age = age
self.gender = gender
self.height = height
self.weight = weight
?
实例化两个对象,分别调用介绍方法。
示例如下:
p1 = Person('张三', 18, '男', 180, 80)
p1.desc()
p2 = Person('李四', 18, '女', 165, 55)
p2.desc()
# 执行结果
# 你好,我的名字是张三,我的身高是180cm!
# 你好,我的名字是李四,我的身高是165cm!
可以发现每次self调用的都是所实例化对象的属性内容,
也就是该方法中的self就代表当前实例化对象。
通过self.__class__获取对象类名。在desc方法中增加打印。
示例如下:
def desc(self):
print('你好,我的名字是%s,我的身高是%dcm!' % (self.name, self.height))
print(self.__class__)
执行结果:
你好,我的名字是张三,我的身高是180cm!
<class '__main__.Person'>
你好,我的名字是李四,我的身高是165cm!
<class '__main__.Person'>
?
self不是关键字,换成其他的标识符也是可以的,但通常会命名为self,
你可以理解为这是一种命名规范。
示例如下:
def desc(aa):
print('你好,我的名字是%s,我的身高是%dcm!' % (aa.name, aa.height))
print(aa.__class__)
换成aa后,执行结果没有任何改变;但是不提倡这么做,在项目开发中不容易理解容易产生误会,也会让别人认为你不专业。
__del__() 释放对象,是自动调用的。
在Person类中设置__del__方法,并在其中打印提示内容,
这样在自动调用析构函数时,我们可以看到调用提示。
示例如下:
class Person(object):
def run(self):
print('跑步')
def eat(self, food):
print('吃%s' % food)
def look(self, name):
print('看%s' % name)
def __del__(self):
print('这里是析构函数,将释放对象')
?
实例化person类后,使用del删除对象即可释放对象。
示例如下:
p1 = Person()
del p1
# 一般程序结束 就会释放对象 通过while使程序暂时不结束 查看析构函数执行
while 1:
pass
# 执行结果
# 这里是析构函数,将释放对象
对象释放后就不能再调用了。
在函数中实例化的对象,会在函数结束的时候自动释放,所以程序没结束,我们也没删除对象就释放了。这样可以减少内存空间的浪费。
示例如下:
def test():
p1 = Person()
test()
while True:
pass
# 执行结果
# 这里是析构函数,将释放对象
重写:将函数重新定义写一遍。
重写了__str__方法用法:
1.把对象以字符串输出。
2.当一个对象的属性值很多,并且都需要打印,可以简化代码。
在str方法中设置返回包含当前对象的姓名、年龄、性别、身高、体重等的字符串信息。
示例如下:
def __str__(self):
return '姓名%s,年龄%d,性别%s,身高%d,体重%d' % (self.name, self.age, self.gender, self.height, self.weight)
?
在实例化对象后,使用print打印当前实例化对象,如果设置了str方法就会自动调用。
示例如下:
p1 = Person('张三', 18, '男', 180, 80)
print(p1)
p2 = Person('李四', 18, '女', 165, 55)
print(p2)
# 执行结果
# 姓名张三,年龄18,性别男,身高180,体重80
# 姓名李四,年龄18,性别女,身高165,体重55
设置repr方法与str方法处理做一点区别,并注释掉str方法。
示例如下:
# def __str__(self):
# return '姓名%s,年龄%d,性别%s,身高%d,体重%d' % (self.name, self.age, self.gender, self.height, self.weight)
def __repr__(self):
return '姓名%s-年龄%d-性别%s-身高%d-体重%d' % (self.name, self.age, self.gender, self.height, self.weight)
当str方法没有设置,而设置了repr方法时,打印对象会自动调用repr方法。
示例如下:
p1 = Person('张三', 18, '男', 180, 80)
print(p1)
p2 = Person('李四', 18, '女', 165, 55)
print(p2)
# 执行结果
# 姓名张三-年龄18-性别男-身高180-体重80
# 姓名李四-年龄18-性别女-身高165-体重55
本篇在《Python 面向对象(1)》基础上,对面向对象的构造函数、self是什么、析构函数、重写函数等内容进行讲解以及相关示例。