python入门2

为了加深对面向对象的理解,看下面的代码


定义了一个烤的类。初始化默认为烤了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,调用引用计数被删除的变量时会报错,而调用未被删除的变量时依然显示删除完之后的结果。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容