(标答出处: 鱼C论坛)
《零基础入门学习Python》
测试题:
答:不对,会进行无限死循环,因为self.name = value +1 不会停的调用__ setattr __ 方法。 应改为:
def __setattr__ (self , name , value ) :
self.__dict__[name] = value + 1
"""或"""
def __setattr__ (self , name , value ) :
super().__ettattr__ = value + 1
答:重写 __ getattrtibute __ 魔法方法
答:
位置一:3
位置二:2 None
答: 打印:
2
1
答:self.counter = 0
这句话在定义并幅值的时候会引用__setattr__
函数,进入这个函数后,执行self.counter += 1
的操作,但是此时还没有对self.counter进行定义,所以没法对它进行 +1 操作,错误。
动动手:
class A :
def __getattr__ (self , name) :
return '该属性不存在'
a = A()
print (a.x)
运行结果:
class Demo () :
def __init__ (self) :
self.x = '小甲鱼'
def __getattr__ (self,name) :
super().__getattribute__(name)
def __setattr__ (self,name,value) :
super().__setattr__(name,value)
def __delattr__ (self,name) :
super().__delattr__(name)
demo = Demo()
print (demo.x)
demo.x = 'X-man'
print (demo.x)
运行结果:
class Counter () :
def __init__ (self) :
super().__setattr__('counter',0)
def __getattr__ (self,name) :
super().__getattribute__(name)
def __setattr__ (self,name,value) :
super().__setattr__('counter',self.counter+1)
super().__setattr__(name,value)
def __delattr__ (self,name) :
super().__setattr__('counter',self.counter-1)
super().__delattr__(name)
c = Counter()
c.x = 1
print (c.counter)
c.y = 1
c.z = 1
print (c.counter)
del c.x
print (c.counter)
运行结果: