魔术方法是python中特殊方法的昵称,读作“Dunder line”。魔术方法不用用户调用,当类满足特定条件时自动触发
1.__new__(cls,*args,**kargs):
__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
2.__str__():
该魔术方法系统自动调用时返回对象的内存地址,当实例化类后打印实例化对象输出对象的地址,一般对用户用处不大,可以重写该方法,输出一些类的细节信息
def __str__(self):
return "姓名:"+self.name
3._del__():
删除对对象的引用时会触发__del__
def __del__(self):
print("__del__")
p1=p
p2=p
print(id(p1),id(p2))
del(p1)
print(id(p))
4.__call__(self):
该方法使对象能够像函数一样被调用,
5.__getitem__(self,*args)
该方法完美的体现了魔术方法的用处,该方法使用户自己的类可以实现切片,迭代等操作,如同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)
共有条评论 网友评论