|
发表于 2022-3-15 03:00:16
From FishC Mobile
|
显示全部楼层
本帖最后由 mclb 于 2022-3-15 10:07 编辑
lzb1001 发表于 2022-3-15 00:43
class C:
def __getattribute__(self, name):
不好意思,习惯语法高亮了,没注意到你super用法写错了。把下面的程序里直接复制并分成三份运行一遍, 注释都写了,你应该懂的。
# coding=utf-8
class Demo0(object):
def __getattribute__(self, item):
value = object.__getattribute__(self, item) # 通过父类object的__getattribute__方法获取当前实例化对象的属性
# value = super(Demo0, self).__getattribute__(item) # 效果与上一行一样,只有这两种写法才可以使用父类访问当前对象属性,而不会触发魔法
print(item, value) # 打印 (属性名, 属性值)
return value # 返回 属性值
def __getattr__(self, item):
return [item] # 返回 [属性名]
Test0 = Demo0()
value = Test0.a
print(value)
class Demo1(object):
def __getattribute__(self, item):
value = object.__getattribute__(self, item) # 通过父类object的__getattribute__方法获取当前实例化对象的属性
# value = super(Demo1, self).__getattribute__(item) # 效果与上一行一样
print(item, value) # 打印 (属性名, 属性值)
return value # 返回 属性值
def __getattr__(self, item):
print("找不到名为 %s 的属性" % item) # 打印 (找不到的属性名)
Test1 = Demo1()
Test1.b
class Demo2(object):
def __getattribute__(self, item):
value = object.__getattribute__(self, item) # 通过父类object的__getattribute__方法获取当前实例化对象的属性
# value = super(Demo2, self).__getattribute__(item) # 效果与上一行一样
print(item, value) # 打印 (属性名, 属性值)
return value # 返回 属性值
Test2 = Demo2()
Test2.c |
|