面向對象進階——類中的方法

  類中的方法,其實就是類中定義的函數,能夠分爲:綁定方法、非綁定方法。函數

1、綁定方法

  綁定方法:綁定給誰,就應該由誰來調用,誰來調用就會把調用者看成第一個參數自動傳入工具

一、綁定到對象的方法

  在類內定義的沒有被任何裝飾器修飾的
spa

  特色:爲對象量身定製;3d

     對象.bound_method(),自動將對象當作第一個參數傳入(屬於類的函數,類能夠調用,可是必須按照函數的規則來,沒有自動傳值那麼一說code

二、綁定到類的方法

  在類內定義的被裝飾器@classmethod修飾的方法對象

  特色:爲類量身定製;blog

       類.bound_method(),自動將類當作第一個參數傳入(其實對象也能夠調用,但仍將類做爲第一個參數傳入md5

2、非綁定方法(@staticmethod)

  非綁定方法:在類中用@staticmethod裝飾器裝飾的方法。utf-8

  特色:不與類或對象綁定,類和對象均可以調用,可是沒有自動傳值那麼一說。就是一個普通工具而已。hash

一、與綁定到對象方法區別

  在類中直接定義的函數,沒有被任何裝飾器裝飾的,都是綁定到對象的方法,可不是普通函數,對象調用該方法會自動傳值;

  而staticmethod裝飾的方法(非綁定方法),無論誰來調用,都沒有自動傳值一說。

class Foo:
    def __init__(self, name):
        self.name = name

    def tell(self):  # 綁定了對象的函數
        print('名字是%s' % self.name)

    @classmethod
    def func(cls):  # 綁定了類的方法,默認傳入參數是類自己
        print(cls)

    @staticmethod
    def func1(x, y):   # 在類內部的普通函數
        print(x+y)

f = Foo('egon')
print(Foo.tell)
print(f.tell)
"""
<function Foo.tell at 0x104021378>
<bound method Foo.tell of <__main__.Foo object at 0x101fb6390>>
"""
print(Foo.func)
"""
<bound method Foo.func of <class '__main__.Foo'>>
"""
Foo.func()
"""
<class '__main__.Foo'>
"""

print(Foo.func1)
f.func1(1, 3)
Foo.func1(2, 4)
"""
<function Foo.func1 at 0x104021488>
4
6
"""

二、綁定方法和非綁定方法的應用

  現有配置文件settings.py

name = 'alex'
age = 18
sex = 'female'

  運用類的方法,查看配置文件信息:

import settings
import hashlib
import time

class People:
    def __init__(self, name, age, sex):
        self.id = self.create_id()
        self.name = name
        self.age = age
        self.sex = sex

    def tell_info(self):
        print('Name %s Age %s Sex %s' % (self.name, self.age, self.sex))

    @classmethod
    def from_conf(cls):
        obj= cls(
            settings.name,
            settings.age,
            settings.sex
        )
        return obj

    @staticmethod
    def create_id():  # 不依賴類和對象的方法,所以建立普通函數
        m = hashlib.md5(str(time.time()).encode('utf-8'))
        return m.hexdigest()


p = People('egon',18,'male')
# 綁定給對象,就應該由對象來調用,自動將對象自己當作第一個參數傳入
p.tell_info()   # tell_info(p)
"""
Name egon Age 18 Sex male
"""

# 綁定給類,就應該由類來調用,自動將類自己當作第一個參數傳入
p=People.from_conf()  # from_conf(People)
p.tell_info()
"""
Name alex Age 18 Sex female
"""


# 非綁定方法,不與類或對象綁定,誰均可以調用,沒有自動傳值一說
p1 = People('egon1', 18, 'male')
p2 = People('egon2', 28, 'male')
p3 = People('egon3', 38, 'male')
print(p1.id)
print(p2.id)
print(p3.id)
"""
a653d2ce4826a31051d7ddd13a9d82cf
4c0f5168f3a2fdb96a37430380d336e4
b214300c918bc319b840077dfdbb8425
"""
相關文章
相關標籤/搜索