关卡二:
1.练习题1
面向对象的理解
要求:
在类内定义一个可以重新设置私有属性name的函数条件为字符串长度小于10,才可以修改.
答:
def SetName(self, newname):
if len(newname) < 10:
self.__name = newname
else:
print("error:名字太长!")
在创建一个类之后需要调用什么函数?
答:应调用__del__()函数.
del()方法是手动调用还是类默认调用?
答:手动调用
如何访问对象的属性?
答:使用(.)来访问对象的属性
创建一个动物类,并通过init方法接受参数(name),并打印init被调用.
class Animal(object):
# 初始化方法
# 创建完对象后会自动被调用
def __init__(self, name):
print('__init__方法被调用')
self.__name = name
在动物类中定义一个析构方法,使其在删除的时候自动被调用,并打印del被调用.
def __del__(self):
print("__del__方法被自动调用")
实例化一个dog对象取名"八公"
dog = Animal("八公")
将实例dog赋值给dog1和dog2.
dog1 = dog
dog2 = dog
print(" 删除dog对象")
del dog
print(" 删除dog1对象")
del dog1
print(" 删除dog2对象")
del dog2
观察运行结果发现什么问题?
答:只有当第三个对象被删除的时候,dog对象才被正真的删除.
上述结果说明什么问题?
答:
- 当有1个变量保存了对象的引用时,此对象的引用计数就会加1
- 当使用del删除变量指向的对象时,如果对象的引用计数不会1,比如3,那么此时只会让这个引用计数减1,即变为2,当再次调用del时,变为1,如果再调用1次del,此时会真的把对象进行删除