魔术方法

    科技2025-10-15  10

             魔术方法是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)  
    Processed: 0.009, SQL: 9