090 類和對象的綁定方法和非綁定方法

  • 類中定義的方法大體能夠分爲兩類:綁定方法和非綁定方法python

  • 其中綁定方法又能夠分爲綁定到對象的方法和綁定到類的方法。sql

1、綁定方法

1.1 對象的綁定方法

在類裏面沒有使用任何裝飾器修飾的方法就是綁定到對象的方法,這類方法是專門爲對象定製的函數

class Person:
    city = 'shanghai'
    def __init__(self,name,age):
        self.name = name
        self.age = age
        
     def speak(self):
        print(f'{self.name}會說話')

peo = Person('xichen',18)
print(peo.__dict__)
peo.speak()

{'name':'xichen','age':18}ui

xichen會說話.net

print(Person.__dict__['speak'])

<function Person.speak at 0x10f0dd268>code

注意:對象

1.speak即綁定到對象的方法,這個方法不在對象的名稱空間中,而是在類的名稱空間中ip

2.經過對象調用綁定到對象的方法式,會有一個自動傳參的過程,也就是對象調用它的綁定方法時不用傳參數,會自動將這個調用綁定方法的對象傳過去(僅限第一個參數self,通常都叫self,也能夠寫成別的名稱);如果使用類調用,則第一個參數須要手動傳值。ci

# 1.經過對象調用
p = Person('xichen',18)
p.speak()

xichen會說話字符串

# 2.經過類調用
Person.speak(p)

xichen會說話

2.2類的綁定方法

類中使用 @classmethod修飾的方法就時綁定到類的方法,這類方法專門爲類定製。經過類名調用綁定到類的方法時,會將類自己當作參數傳給類方法的第一個參數。

class Person:
    city = 'shanghai'
    def __init__(self,name,age):
        self.name = name
        self.age = age
        
    @classmethod
    def speak(cls):# 約定俗成第一個參數名爲cls,也能夠定義爲其餘參數名
        print(cls.__name__)
        print(f'{cls.__name__}是個類')
        
Person.speak()

Person
Person是個類

注:經過類也能夠調用類的綁定方法,只是它仍是默認傳遞的第一個參數仍是這個對象對應的類

*經過對象調用類的綁定方法,它的輸出結果仍是同樣的

peo = Person('xichen',18)
peo.speak()

Person
Person是個類

2、非綁定方法

靜態方法

在類裏面使用@staticmethod修飾的方法就是非綁定方法,這類方法和普通定義的函數沒有區別,不與類或對象綁定,誰均可以調用,可是無論是類仍是對象調用都沒有自動傳值的效果。

class Person:
    city = 'shanghai'

    def __init__(self, name, age):
        self.name = name
        self.age = age

    @classmethod  # 類的綁定方法
    def speak(cls):  # 約定俗成第一個參數名爲cls,也能夠定義爲其餘參數名
        print(cls.__name__)
        print(f'{cls.__name__}是個類')

    @staticmethod  # 非綁定方法,誰均可以調用
    def get_city(obj):
        obj.city = 'beijing'
        print(obj.city)


        
peo = Person('xichen',18)
peo.get_city(peo) # 對象調用

Person.get_city(Person)# 類來調用

beijing
beijing

簡而言之,非綁定方法就是將普通方法放到了類的內部。

3、練習

假設咱們如今有一個需求,須要讓Mysql實例化出的對象能夠從文件settings.py中讀取數據。

# settings.py
IP = '1.1.1.10'
PORT = 3306
NET = 27
# test.py
import uuid


class Mysql:
    def __init__(self, ip, port, net):
        self.uid = self.create_uid()
        self.ip = ip
        self.port = port
        self.net = net

    def tell_info(self):
        """查看ip地址和端口號"""
        print('%s:%s' % (self.ip, self.port))

    @classmethod
    def from_conf(cls):
        return cls(IP, NET, PORT)

    @staticmethod
    def func(x, y):
        print('不與任何人綁定')

    @staticmethod
    def create_uid():
        """隨機生成一個字符串"""
        return uuid.uuid1()


# 默認的實例化方式:類名()
obj = Mysql('10.10.0.9', 3307, 27)
obj.tell_info()

10.10.0.9:3307

3.1綁定方法小結

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

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

# 一種新的實例化方式:從配置文件中讀取配置完成實例化
obj1 = Mysql.from_conf()
obj1.tell_info()

1.1.1.10:27

print(obj.tell_info)

<bound method Mysql.tell_info of <main.Mysql object at 0x10f469240>>

print(obj.from_conf)

<bound method Mysql.from_conf of <class 'main.Mysql'>>

3.2 非綁定方法小結

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

obj.func(1, 2)

不與任何人綁定

Mysql.func(3, 4)

不與任何人綁定

print(obj.func)

<function Mysql.func at 0x10f10e620>

print(Mysql.func)

<function Mysql.func at 0x10f10e620>

print(obj.uid)

a78489ec-92a3-11e9-b4d7-acde48001122

相關文章
相關標籤/搜索