zhangfeiwen 发表于 2020-9-28 19:37:46

47讲定制序列关于c1.values不会触发getitem

class CountList:
    def __init__(self,*args):
      self.values =
      self.count = {}.fromkeys(range(len(self.values)),0)
    def __len__(self):
      return len(self.values)
    def __getitem__(self,key):
      print('访问我了')
      self.count += 1
      return self.values

#c1=CountList(22,33,44,55)
#c1.values不会触发getitem
c1会触发,但是c1.values不会触发getitem。这是为什么?
难道c1.values不属于访问容器元素吗,

sunrise085 发表于 2020-9-28 21:09:15

__getitem__是该类对象的方法,不是该类对象属性的方法。
c1会触发,因为是该类对象访问了容器元素。
而c1.value是该类对象的属性访问了容器元素。

Stubborn 发表于 2020-9-28 21:26:42

c1.values这个是列表,由列表管理的,不是c1类管理

zhangfeiwen 发表于 2020-9-29 08:55:00

sunrise085 发表于 2020-9-28 21:09
__getitem__是该类对象的方法,不是该类对象属性的方法。
c1会触发,因为是该类对象访问了容器元素。
...

我要是想让出c1.values有同样的效果
该类对象属性的方法怎么写{:5_99:}

sunrise085 发表于 2020-9-29 09:14:39

zhangfeiwen 发表于 2020-9-29 08:55
我要是想让出c1.values有同样的效果
该类对象属性的方法怎么写

那是另一个魔法函数,第46讲不是有么?
class CountList:
    def __init__(self,*args):
      self.values =
      self.count = {}.fromkeys(range(len(self.values)),0)
    def __len__(self):
      return len(self.values)
    def __getitem__(self,key):
      print('访问我了')
      self.count += 1
      return self.values
    def __getattribute__(self,name):
      print('getattribute',name)
      return super().__getattribute__(name)
print("第一句")
c1=CountList(22,33,44,55)
print("第二句")
print(c1)
print("第三句")
print(c1.values)

zhangfeiwen 发表于 2020-9-29 22:34:25

sunrise085 发表于 2020-9-29 09:14
那是另一个魔法函数,第46讲不是有么?

{:10_254:}感谢大佬 突然想到就问你了

zhangfeiwen 发表于 2020-9-29 22:35:07

Stubborn 发表于 2020-9-28 21:26
c1.values这个是列表,由列表管理的,不是c1类管理

感谢答疑{:10_254:}
页: [1]
查看完整版本: 47讲定制序列关于c1.values不会触发getitem