为了加深对面向对象的理解,看下面的代码
定义了一个烤的类。初始化默认为烤了0分钟,烤的情况是生的,调料列表也是空的。对象转化为字符串时输出烤地瓜的时间,烤的情况,以及加入的调料。定义一个烤的方法,根据对象传递的时间判断烤的情况。如果烤熟了,则调用添加调料addcondiments()的方法添加调料。创建一个digua1的对象来测试输出。结果如下:
接下来,涉及到对象的传递,先进行一个简单的例子:
在调用a.test(b)这个方法时,item同时指向了b指向的地址,所以对item.num重新复制,也就同时改变了b的值。所以出现了上图所示的结果。这就是对象的传递。
下面将测试一下对象的传递
也就是说如果一个对象与另一个对象有一定的关系,那么一个对象可以用另一个对象的属性。
保护对象的属性
如果一个对象需要对其属性进行修改时,有两种方法:
一种是 对象名.属性=数据 ----- 直接修改
另一种是 对象名.方法名() ----- 间接修改
为了更好的保护属性的安全,不建议使用第一种方法,一般处理的方式是将属性定义为私有属性,添加一个可以调用的方法,供调用。
错误显示没有这个属性。
解决办法:
可以通过调用方法访问到属性,因此可以在方法里设置约束条件进行判断
�
Python中没有像C++中public和private这些关键字来区别公有属性和私有属性。它是以属性命名方式来区分,如果在属性名前面加了2个下划线'__',则表明该属性是私有属性,否则为公有属性(方法也是一样,方法名前面加了2个下划线的话表示该方法是私有的,否则为公有的)。
创建对象后,python解释器默认调用__init__()方法;当删除一个对象时,python解释器也会默认调用一个方法,这个方法为__del__()方法。__del__()会在对象被垃圾回收时被调用,该方法可以释放资源,比如文件的连接,数据库的连接等。
import sys
class Student:
def __init__(self,name):
print('__init__')
self.__name=name
def __del__(self):
print('__del__')
stu1=Student('Tony')
stu2=stu1
#获取对象的引用数量,多一个
print(sys.getrefcount(stu1))
del stu1
#获取对象的引用数量,多一个
print(sys.getrefcount(stu1))
运行结果显示为
如果改为获取stu2的引用数量,删除stu1后,那结果为
可以看出stu1和stu2的引用数量是相同的,由于删除stu1后,系统找不到所以会报错,而删除stu1对stu2没有影响,所以引用数量为2。
也就是说当有一个变量保存了对象的引用后,此对象的引用就会加1。当使用del删除变量指向的对象时,如果对象的引用计数不为1,则减1,调用引用计数被删除的变量时会报错,而调用未被删除的变量时依然显示删除完之后的结果。