Python Binder 方法與非Binder 方法

來源:互聯網
上載者:User

標籤:static   重複   mys   讀取   pytho   method   return   class   相同   

用到的:

  import uuid  --------------  uuid是128位的通用唯一識別碼, 通常用32位的一個字串的形式來表現

  uuid.uuid1()  -------------  基於MAC地址,時間戳記,隨機數來產生唯一的uuid,可以保證全球範圍內的唯一性

  uuid.uuid3()  -------------  通過計算一個命名空間和名字的md5散列值來給出一個uuid,所以可以保證命名空間中的不同名字具有不同的uuid,但是相同的名字就是相同的uuid了

  uuid.uuid4()  -------------  通過偽隨機數得到uuid,是有一定機率重複的

  uuid.uuid5()  -------------  和uuid3基本相同,只不過採用的散列演算法是sha1

  @classmethod  ---------  加入到定義給類的Binder 方法上(綁定給類的應該有類來調用, 但對象其實也可以使用, 只不過自動傳入的仍然是類)

  @staticmethod  ---------  加入到定義的非Binder 方法函數上(但是無論誰來調用, 都沒有任何自動傳值的效果, 就是一個普通函數)

1. Binder 方法

特性: 綁定給誰就應該由誰來調用, 誰來調用就會將誰當作第一個參數自動傳入<<精髓在於自動傳值>>

Binder 方法分為兩類:

  1. 綁定給對象方法:

    在類內部定義的函數(沒有被任何裝飾器修飾的), 預設就是綁定給對象用的

  2.綁定給類的方法:

    在類內部定義的函數如果被裝飾器@classmethod裝飾, 那麼則是綁定給類的, 應該由類來調用, 類來調用就自動將類當作第一個參數自動傳入

 

2. 非Binder 方法

類中定義的函數如果被裝飾器@staticmethod裝飾, 那麼該函數就變成非Binder 方法

既不與類綁定, 又不與對象綁定, 意味著類與對象都可以來調用

但是無論誰來調用, 都沒有任何自動傳值的效果, 就是一個普通函數

 

3.應用

如果函數體代碼需要用外部傳入的類, 則應該將該函數定義成綁定給類的方法

如果函數體代碼需要用外部傳入的對象, 則應該將該函數定義成綁定給對象的方法

如果函數體代碼既不需要外部傳入的類也不需要外部傳入的對象,則應該將該函數定義成非Binder 方法/普通函數

 例如:

 1 class Foo: 2     @classmethod 3     def f1(cls): 4         print(cls) 5  6     def f2(self): 7         print(self) 8  9 obj = Foo()10 11 print(obj.f2)
>>><bound method Foo.f2 of <__main__.Foo object at 0x000001F2D4AFCCC0>>12 print(Foo.f1)
>>><bound method Foo.f1 of <class ‘__main__.Foo‘>>13 Foo.f1()
>>><class ‘__main__.Foo‘>14 print(Foo)
>>><class ‘__main__.Foo‘>

f1是綁定給類的

綁定給類的應該有類來調用, 但對象其實也可以使用, 只不過自動傳入的仍然是類

1 print(Foo.f1)
>>><bound method Foo.f1 of <class ‘__main__.Foo‘>>2 print(obj.f1)
>>><bound method Foo.f1 of <class ‘__main__.Foo‘>>3 Foo.f1()
>>><class ‘__main__.Foo‘>4 obj.f1()
>>><class ‘__main__.Foo‘>

f2是綁定給對象的

1 obj.f2()
>>><__main__.Foo object at 0x00000203677CCCF8>2 Foo.f2(obj)
>>><__main__.Foo object at 0x00000203677CCCF8>

 

例子(列印ip和連接埠):

 1 import settings 2 import uuid 3  4 class Mysql: 5     def __init__(self, ip, port, net): 6         self.uid = self.create_uid() 7         self.ip = ip 8         self.port = port 9         self.net = net10 11     def tell_info(self):12         print(‘%s:%s‘ % (self.ip, self.port))13 14     @classmethod15     def from_conf(cls):16         return cls(settings.IP, settings.NET, settings.PORT)17 18     @staticmethod19     def func(x, y):20         print(‘不與任何人綁定‘)21 22     @staticmethod23     def create_uid():24         return uuid.uuid1()

預設的執行個體化方式: 類名(...)

obj = Mysql(‘10.10.0.9‘,3307)

一種新的執行個體化方式: 從設定檔中讀取配置完成執行個體化

1 obj1 = Mysql.from_conf()2 obj1.tell_info()
1 obj.func()
>>>不與任何人綁定2 Mysql.func()
>>>不與任何人綁定3 print(obj.func)
>>><function Mysql.func at 0x000002B7DF688A60>4 print(Mysql.func)
>>><function Mysql.func at 0x000002B7DF688A60>

 

Python Binder 方法與非Binder 方法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.