第045讲: 魔法方法:属性访问 | 学习记录(小甲鱼零基础入门学习Python)

(标答出处: 鱼C论坛)
《零基础入门学习Python》

测试题:
第045讲: 魔法方法:属性访问 | 学习记录(小甲鱼零基础入门学习Python)_第1张图片
答:不对,会进行无限死循环,因为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 __ 魔法方法
第045讲: 魔法方法:属性访问 | 学习记录(小甲鱼零基础入门学习Python)_第2张图片
答:
位置一:3
位置二:2 None
在这里插入图片描述
第045讲: 魔法方法:属性访问 | 学习记录(小甲鱼零基础入门学习Python)_第3张图片
答: 打印:
2
1
第045讲: 魔法方法:属性访问 | 学习记录(小甲鱼零基础入门学习Python)_第4张图片
第045讲: 魔法方法:属性访问 | 学习记录(小甲鱼零基础入门学习Python)_第5张图片
答:self.counter = 0 这句话在定义并幅值的时候会引用__setattr__函数,进入这个函数后,执行self.counter += 1的操作,但是此时还没有对self.counter进行定义,所以没法对它进行 +1 操作,错误。

动动手:
在这里插入图片描述

class A :
    def __getattr__ (self , name) :
        return '该属性不存在'

a = A()
print (a.x)

运行结果:
在这里插入图片描述
第045讲: 魔法方法:属性访问 | 学习记录(小甲鱼零基础入门学习Python)_第6张图片

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)

运行结果:
在这里插入图片描述
第045讲: 魔法方法:属性访问 | 学习记录(小甲鱼零基础入门学习Python)_第7张图片

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)

运行结果:
在这里插入图片描述

你可能感兴趣的:(第045讲: 魔法方法:属性访问 | 学习记录(小甲鱼零基础入门学习Python))