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

(标答出处: 鱼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)

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值