__new__是在创建类时第一个被系统调用的函数,用来创建一个空间,并将值传给__init__(self)中的self,重写__new__()一定要将父类的__new__使用return返回,否则无法继续执行。
class person: def __init__(self,name): print(self) self.name=name print(name) def __new__(cls,*args,**kargs): print("___new___") position=object.__new__(cls) print(position) return position该魔术方法系统自动调用时返回对象的内存地址,当实例化类后打印实例化对象输出对象的地址,一般对用户用处不大,可以重写该方法,输出一些类的细节信息
def __str__(self): return "姓名:"+self.name删除对对象的引用时会触发__del__
def __del__(self): print("__del__") p1=p p2=p print(id(p1),id(p2)) del(p1) print(id(p))
该方法使对象能够像函数一样被调用,
该方法完美的体现了魔术方法的用处,该方法使用户自己的类可以实现切片,迭代等操作,如同list,dir等内置函数一样。下面的例子是一个建立52张卡牌的类(摘至于《流畅的python》)。
1.nametuple(name,[参数1,参数2,参数3])用于快速建立一个对象,该对象没有方法,只有属性。
2.split()返回一个列表
3.私有属性_card是一个队列,每个元素的属性是Card的对象
4.random.choice()从序列表中随机挑选一个元素
import collections import random Card=collections.namedtuple("card",["rank","suit"]) class Deck: ranks=[str(i) for i in range(2,11)]+list("AJQK") suits="spades diamonds clubs hearts".split(" ") def __init__(self,Card): self._card=[Card(rank,suit) for rank in self.ranks for suit in self.suits] def get(self): return self._card def __getitem__(self,position): return self._card[position] def __len__(self): return len(self._card) def rand_card(self): return random.choice(self._card) card=Deck(Card) print("-------slice:-------------") print("card[1]:",card[1]) print("card[1:-1:2]",card[1:-1:2]) print("-------iterable----------") for i in card: print(i) print("-------随机发牌----------") print(card.rand_card()) print("-----判断某个值是否属于类——") Card("9","spade") in card #suit_value=dir(spades=1,diamonds=2,clubs=3,hearts)