1. 程式人生 > >Python 綁定方法與非綁定方法

Python 綁定方法與非綁定方法

第一個 span 基於 ssm 計算 bound 例子 0.10 代碼

用到的:

  import uuid -------------- uuid是128位的全局唯一標識符, 通常用32位的一個字符串的形式來表現

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

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

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

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

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

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

1. 綁定方法

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

綁定方法分為兩類:

  1. 綁定給對象方法:

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

  2.綁定給類的方法:

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

2. 非綁定方法

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

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

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

3.應用

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

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

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

例如:

 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 = net
10 
11     def tell_info(self):
12         print(%s:%s % (self.ip, self.port))
13 
14     @classmethod
15     def from_conf(cls):
16         return cls(settings.IP, settings.NET, settings.PORT)
17 
18     @staticmethod
19     def func(x, y):
20         print(不與任何人綁定)
21 
22     @staticmethod
23     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 綁定方法與非綁定方法