Python 属性查找顺序
·
最近在打基础,过去有点沉不下心来
from collections import namedtuple
Card = namedtuple("Card",['rank','suit'])
class FrenchDeck:
ranks = [i for i in range(2,11)]+[i for i in "JQKA"]
suits = "spades diamonds clubs hearts".split()
def __init__(self):
self.cards = [Card(i,j) for i in self.ranks for j in self.suits]
def __len__(self):
return len(self.cards)
def __getitem__(self,position):
return self.cards[position]
from random import choice
myDeck = FrenchDeck()
print(choice(myDeck))
如上代码,其实是我复现流畅的python时,对比原书代码发现不小心把class变量写为实例属性去了,但是拿出来的时候想试一试self去访问会不会报错,结果发现不会报错,开始研究其中的细节
那就不得不提到命名空间
只有能持有属性的对象,有命名空间,这样就锁定了命名空间概念使用的范围
int,tuple,list之类的没有命名空间,他们不能动态的增加属性,这是因为他们是内置类型,是由C底层实现的结构
a = 10
print(a.__dict__)
Traceback (most recent call last):
File "e:\COde\Python\aaastudy\day4\_collections_1.py", line 2, in <module>
print(a.__dict__)
AttributeError: 'int' object has no attribute '__dict__'. Did you mean: '__dir__'?
所以最终默认的查找路径其实是
instance.__dict__ → class.__dict__ → base class.__dict__ → ... → object
最后找不到 → 调用 __getattr__ → 否则 AttributeError
并且延申而来的很多方法绑定,slots属性....
都与之相关,今天到此为止
更多推荐


所有评论(0)