java 端口映射 进程 LeetCode linux创建文件 Nginx 深度图像 powershell callback vue原理 bootstrap管理模板 多商户商城模板 查看rabbitmq版本 android常用布局 matlab 图像识别 windows查看进程命令 反函数的二阶导数 kubernetes集群搭建 python环境 python迭代器 java时间函数 java连接mysql数据库 java原始数据类型 java线程中断 java中new java接口的修饰符 java中random java文件读取 java函数调用 java绝对值 linux安装 c语言指数函数 页面刷新 流水账软件 idea导出jar包 幽灵行动多少钱 神魔辅助 ftp客户端软件 lol无法连接服务器 chrome访问助手
当前位置: 首页 > 学习教程  > 编程语言

魔术方法

2020/10/8 20:07:24 文章标签:

魔术方法是python中特殊方法的昵称,读作“Dunder line”。魔术方法不用用户调用,当类满足特定条件时自动触发 1.__new__(cls,*args,**kargs): __new__是在创建类时第一个被系统调用的函数,用来创建一个空间,并将值传给__init__(s…

         魔术方法是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)
 

本文链接: http://www.dtmao.cc/news_show_250203.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?