類和對象的方法

一、綁定方法和非綁定方法

類中定義的函數分爲兩大類:綁定方法和非綁定方法

  • 綁定方法:分爲綁定到類和對象的方法,綁定給誰,就應該由誰來調用,誰來調用就回把調用者當作第一個參數自動傳入

    • 綁定到對象的方法:在類內定義的沒有被任何裝飾器修飾的

    • 綁定到類的方法:在類內定義的被裝飾器classmethod修飾的方法

  • 非綁定方法沒有自動傳值這麼一說了,就類中定義的一個普通工具,對象和類都可以使用

    • 非綁定方法:爲類中某個函數加上裝飾器@staticmethod,不與類或者對象綁定
    class Foo:
        def __init__(self, name):
            self.name = name
    
        def tell(self):
            print('名字是%s' % self.name)
    
        @classmethod
        def func(cls):  # cls=Foo
            print(cls)
    
        @staticmethod
        def func1(x, y):
            print(x + y)
    
    
    # 實例對象調用對象的綁定方法
    f = Foo('tester')  # 名字是tester
    f.tell()  # 3
    # 實例對象調用靜態方法(非綁定方法)
    f.func1(1, 2)
    # 實例的對象調用類方法
    f.func()  # <class '__main__.Foo'>
    
    # 類調用類方法(綁定方法)
    Foo.func()  # <class '__main__.Foo'>
    # 類調用靜態方法
    Foo.func1(2, 3)  # 5
    

二、類裏面的裝飾器

  • @staticmethod ,把類裏面的函數設置爲靜態方法,即爲非綁定發放

  • @classmethod,被裝飾的方法設置爲類方法,類方法的第一個參數指向類對象自己

  • @property,把方法當成屬性一樣去使用

    class People:
        def __init__(self, name):
            self.__name = name
    
        @property
        def name(self):
            # print('getter')
            return self.__name
    
        @name.setter
        def name(self, val):
            # print('setter',val)
            if not isinstance(val, str):
                print('名字必須是字符串類型')
                return
            self.__name = val
    
        @name.deleter
        def name(self):
            print('deleter')
            print('不允許刪除')
    
    
    p = People('tester')
    p.name = 'aa'
    print(p.name)  # aa
    del p.name
    

三 、反射

python是動態語言,而反射(reflection)機制被視爲動態語言的關鍵。反射機制指的是在程序的運行狀態中

  • 對於任意一個類,都可以知道這個類的所有屬性和方法;

  • 對於任意一個對象,都能夠調用他的任意方法和屬性。

這種動態獲取程序信息以及動態調用對象的功能稱爲反射機制。

反射的核心本質就是以字符串的形式去導入一個模塊,利用字符串的形式去執行函數。

反射:通過字符串映射到對象的屬性、方法、模塊

反射的應用

class Service:
    def run(self):
        while True:
            inp = input('>>: ').strip()  # cmd='get a.txt'
            cmds = inp.split()  # cmds=['get','a.txt']

            # print(cmds)
            if hasattr(self, cmds[0]):
                func = getattr(self, cmds[0])
                func(cmds)

    def get(self, cmds):
        print('get.......', cmds)

    def put(self, cmds):
        print('put.......', cmds)


obj = Service()
obj.run()

hasattr(object,name)

判斷object中有沒有一個name字符串對應的方法或屬性

getattr(object, name, default=None)

def getattr(object, name, default=None): # known special case of getattr
    """
    getattr(object, name[, default]) -> value

    Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
    When a default argument is given, it is returned when the attribute doesn't
    exist; without it, an exception is raised in that case.
    """
    pass

setattr(x, y, v)

def setattr(x, y, v): # real signature unknown; restored from __doc__
    """
    Sets the named attribute on the given object to the specified value.

    setattr(x, 'y', v) is equivalent to ``x.y = v''
    """
    pass

delattr(x, y)

def delattr(x, y): # real signature unknown; restored from __doc__
    """
    Deletes the named attribute from the given object.

    delattr(x, 'y') is equivalent to ``del x.y''
    """
    pass
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章