最近在打基础,过去有点沉不下心来

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属性....
都与之相关,今天到此为止

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐