日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

python中幾個(gè)常見(jiàn)的魔法方法

系統(tǒng) 1682 0

首先,什么是魔法方法呢?在python中方法名如果是 xxxx ()的,那么就有特殊的功能,因此叫做“魔法”方法。

__ init__()方法

  • 當(dāng)一個(gè)實(shí)例被創(chuàng)建的時(shí)候調(diào)用的初始化方法,在創(chuàng)建對(duì)象時(shí)默認(rèn)調(diào)用。
  • __ init __()方法中默認(rèn)有一個(gè)參數(shù)名字為self,如果在創(chuàng)建對(duì)象時(shí)傳遞了2個(gè)參數(shù),那么__init __()方法除了self作為第一個(gè)形參外還需要2個(gè)形參,例如__init __(self,x,y)。

之前我們是這樣給對(duì)象添加屬性的:

          
            class Student:
    pass
    
stu1 = Student()

stu1.name = "張三"
stu1.age = 18

          
        

現(xiàn)在我們利用 init ()方法簡(jiǎn)化代碼

          
            class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
stu1 = Student("張三", 18)

          
        

是不是代碼看起來(lái)簡(jiǎn)潔多了呢

str ()方法

  • 一般用于說(shuō)明對(duì)象,或者自己定義一個(gè)想要輸出的結(jié)果。 當(dāng)調(diào)用str()時(shí)會(huì)調(diào)用__str __(),即該對(duì)象被強(qiáng)制轉(zhuǎn)換成字符串類型。
  • 當(dāng)使用print()輸出該對(duì)象時(shí)也會(huì)調(diào)用__str __()方法,只要自己定義了__str
  • __()方法,那么就會(huì)打印這個(gè)方法中return中的數(shù)據(jù)。

沒(méi)有定義__str __()方法時(shí):

          
            '''
遇到不懂的問(wèn)題?Python學(xué)習(xí)交流群:821460695滿足你的需求,資料都已經(jīng)上傳群文件,可以自行下載!
'''
class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
stu1 = Student("張三", 18)
print(stu1)

s = str(stu1)
print(s)

"""
輸出結(jié)果:
<__main__.Student object at 0x03C3BCD0>
<__main__.Student object at 0x03C3BCD0>
"""

          
        

沒(méi)有定義__str __()方法時(shí),它默認(rèn)返回該對(duì)象的內(nèi)存地址。
定義了__str __()方法是這樣的:

          
            class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __str__(self):
        return "姓名:%s\t年齡:%d"%(self.name, self.age)
    
stu1 = Student("張三", 18)
print(stu1)

s = str(stu1)
print(s)

"""
輸出結(jié)果:
姓名:張三   年齡:18
姓名:張三   年齡:18
"""

          
        

del ()方法

當(dāng)刪除一個(gè)對(duì)象時(shí),python解釋器會(huì)默認(rèn)調(diào)用一個(gè)方法,這個(gè)方法為 del ()方法。
首先應(yīng)該先了解一個(gè)概念,那就是對(duì)象的引用個(gè)數(shù)。我們需要sys模塊中的getrefcount()用來(lái)測(cè)量一個(gè)對(duì)象的引用個(gè)數(shù),返回值=實(shí)際的引用個(gè)數(shù)+1。若返回2則說(shuō)明該對(duì)象的實(shí)際引用個(gè)數(shù)為1,此時(shí)有1個(gè)變量引用了該對(duì)象。

          
            import sys
class A:
    pass
a = A()
# 現(xiàn)在只有變量a引用了A類創(chuàng)建的對(duì)象
print(sys.getrefcount(a))
"""
輸出結(jié)果:
2
"""
# 那么現(xiàn)在再創(chuàng)建一個(gè)變量b,也引用a所引用的對(duì)象,那么它的引用個(gè)數(shù)就會(huì)加1,實(shí)際引用個(gè)數(shù)變成2.
b = a
print(sys.getrefcount(a))
"""
輸出結(jié)果:
3
"""

          
        

當(dāng)python解釋器檢測(cè)到,這個(gè)對(duì)象的實(shí)際引用個(gè)數(shù)為0時(shí),就會(huì)刪除這個(gè)對(duì)象,此時(shí)也就會(huì)相應(yīng)的調(diào)用__del __()方法。還有一種情況就是該程序已經(jīng)全部執(zhí)行完了,那么相應(yīng)的內(nèi)存會(huì)被釋放掉,它也會(huì)執(zhí)行__del __()方法。
這是程序正常執(zhí)行完的情況:

          
            import sys
class A:
    def __del__(self):
        print("該對(duì)象被銷毀")
a = A()
"""
輸出結(jié)果:
該對(duì)象被銷毀
"""

          
        

還有一種是手動(dòng)刪除變量引用的情況:

          
            import sys
class A:
    def __del__(self):
        print("該對(duì)象被銷毀")
a = A() # 此時(shí)實(shí)際引用個(gè)數(shù)為1
b = a # 此時(shí)實(shí)際引用個(gè)數(shù)為2

print("刪除了變量a") 
del a # 刪除變量a,此時(shí)實(shí)際引用個(gè)數(shù)為1

print("刪除了變量b") 
del b # 刪除變量b,此時(shí)實(shí)際引用個(gè)數(shù)為0,python解釋器就會(huì)刪除該對(duì)象,即調(diào)用__del __()方法
print("程序結(jié)束")
"""
輸出結(jié)果:
刪除了變量a
刪除了變量b
該對(duì)象被銷毀
程序結(jié)束
"""

          
        

new ()方法

  • __new __也是類在創(chuàng)建實(shí)例時(shí)調(diào)用的方法,它比__init __調(diào)用的時(shí)間還早。
  • __new __至少要有一個(gè)參數(shù)cls,代表要實(shí)例化的類,此參數(shù)在實(shí)例化時(shí)由python解釋器自動(dòng)提供。
  • __new __必須要有返回值,返回實(shí)例化出來(lái)的實(shí)例,這點(diǎn)在自己實(shí)現(xiàn) new 時(shí)要特別注意,可以return父類 new 出來(lái)的實(shí)例,或者直接是object的 new 出來(lái)的實(shí)例。在Python3中每個(gè)類都默認(rèn)繼承的object父類。
  • init 有一個(gè)參數(shù)self,就是這個(gè) new 返回的實(shí)例, init new 的基礎(chǔ)上可以完成一些其它初始化的動(dòng)作
  • init 不需要返回值
          
            class A:
    def __init__(self):
        print("調(diào)用了init方法")

    def __new__(cls):
        print("調(diào)用了new方法")
        return super().__new__(cls)
a = A()

"""
輸出結(jié)果:
調(diào)用了new方法
調(diào)用了init方法
"""

          
        

拓展:可以通過(guò)重寫__new __方法,實(shí)現(xiàn)一個(gè)單例模式

代碼如下:

          
            class A:
    # 定義一個(gè)私有的類屬性,用于存儲(chǔ)實(shí)例化出來(lái)的對(duì)象
    _isinstance = None
    
    def __new__(cls):
        print("調(diào)用了new方法")
        # 判斷如果_isinstance為None,則創(chuàng)建一個(gè)實(shí)例,否則直接返回_isinstance
        if not cls._isinstance:
            cls._isinstance = super().__new__(cls)
        return cls._isinstance


print(id(A))
print(id(A))
print(id(A))
print(id(A))
"""
輸出結(jié)果:
19888488
19888488
19888488
19888488
"""

          
        

__slots __屬性

我們都知道python是一門動(dòng)態(tài)語(yǔ)言,可以在程序運(yùn)行的過(guò)程中添加屬性。如果我們想要限制實(shí)例的屬性該怎么辦?例如,只允許對(duì)Person實(shí)例添加name和age屬性。
為了達(dá)到限制的?的,Python允許在定義class的時(shí)候,定義?個(gè)特殊的 slots 變量,來(lái)限制該class實(shí)例能添加的屬性:

          
            class Person(object):
    __slots__ = ("name", "age") 
P = Person() 
P.name = "?王" 
P.age = 20 
P.score = 100 

"""
輸出結(jié)果:
Traceback (most recent call last):
  File "
            
            ", line 6, in 
            
              
AttributeError: 'Person' object has no attribute 'score'
"""

            
          
        

注意:使? slots 要注意, slots 定義的屬性僅對(duì)當(dāng)前類實(shí)例起作?,對(duì) 繼承的?類是不起作?的。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 平遥县| 墨竹工卡县| 高唐县| 绥棱县| 库尔勒市| 塔河县| 铜陵市| 镇沅| 四会市| 丰城市| 子洲县| 沂水县| 定西市| 晋江市| 筠连县| 伊金霍洛旗| 镇康县| 安溪县| 新安县| 扶绥县| 天气| 饶阳县| 井冈山市| 淳化县| 汾阳市| 阜新市| 桐乡市| 平舆县| 兴安县| 武鸣县| 平江县| 资溪县| 洪洞县| 右玉县| 托克逊县| 汶川县| 鹤峰县| 乌海市| 治县。| 高雄市| 太仓市|