面向對象——靜態方法、類方法、屬性法法,其他特殊方法


靜態方法

定義了靜態方法@staticmethod就與類沒什么關聯,只是名義上仍舊歸屬類,實際上在靜態方法里訪問不了類或實例中的任何屬性。調用靜態方法或者屬性可通過類名.函數名(屬性名)調用,具體實現如下:

未定義靜態方法前:

 1 class Dog(object):
 2     def __init__(self,name):
 3         self.name = name
 4 
 5     def eat(self, food):
 6 
 7         print("%s eating %s"%(self.name, food))
 8 
 9 d = Dog("hh")
10 d.eat("baozi")

定義靜態方法后:

 

 1 class Dog(object):
 2     def __init__(self, name):
 3         self.name = name
 4 
 5     @staticmethod
 6     def eat(food):
 7         print("%s eating %s"%("hh", food))
 8 
 9 d = Dog("hh")
10 d.eat("baozi")

若非要給靜態方法傳遞參數進去,可將實例化后的實例對象傳遞進去

class Dog(object):
    def __init__(self, name):
        self.name = name

    @staticmethod
    def eat(self, food):
        print("%s eating %s"%(self.name, food))

d = Dog("hh")
d.eat(d,"baozi")  # 將d實例對象傳遞給self,原先self就是指實例本身的

類方法

類方法只能訪問類變量,無法訪問實例變量

 1 class Dog(object):
 2     name = 'YI' # 類變量
 3     def __init__(self, name):
 4         self.name = name
 5 
 6     # @staticmethod
 7     @classmethod
 8     def eat(self, food):
 9         print("%s eating %s"%(self.name, food))
10 
11 d = Dog("hh")
12 d.eat("baozi")
13 
14 結果:
15 YI eating baozi

屬性方法

把一個方法變成一個靜態屬性,若想給屬性名賦值,需重新定義一個方法 將屬性傳給方法

 1 class Dog(object):
 2     name = 'YI' # 類變量
 3     def __init__(self, name):
 4         self.name = name
 5 
 6  
 7     @property  # 屬性方法
 8     def eat(self):
 9         print("%s eating %s"%(self.name, "baozi"))
10 
11 d = Dog("hh")
12 d.eat

 若想給屬性名賦值,需重新定義一個方法 將屬性傳給方法

 1 class Dog(object):
 2     name = 'YI' # 類變量
 3     def __init__(self, name):
 4         self.name = name
 5 
 6     # @staticmethod
 7     # @classmethod
 8     @property
 9     def eat(self):
10         print("%s eating %s"%(self.name,"baozi"))
11     @eat.setter
12     def eat(self, food):
13         print("sed to food:", food)
14 
15 d = Dog("hh")
16 d.eat  # 定義了屬性方法已將方法變成靜態屬性
17 d.eat = "HHH"
18 
19 結果:
20 hh eating baozi
21 sed to food: HHH

上面仍是沒有把值傳進去

class Dog(object):
    name = 'YI' # 類變量
    def __init__(self, name):
        self.name = name
        self.__food = None

    # @staticmethod
    # @classmethod
    @property
    def eat(self):
        print("%s eating %s"%(self.name,self.__food))

    @eat.setter
    def eat(self, food):
        print("sed to food:", food)
        self.__food = food

d = Dog("hh")
d.eat  # 定義了屬性方法已將方法變成靜態屬性
d.eat = "HHH"
d.eat  #這個是將“HHH”賦值

結果:
hh eating None
sed to food: HHH
hh eating HHH

將屬性方法變量刪除

class Dog(object):
    name = 'YI' # 類變量
    def __init__(self, name):
        self.name = name
        self.__food = None

    # @staticmethod
    # @classmethod
    @property
    def eat(self):
        print("%s eating %s"%(self.name,self.__food))

    @eat.setter
    def eat(self, food):
        print("sed to food:", food)
        self.__food = food
    @eat.deleter
    def eat(self):
        del self.__food
        print("food 變量已刪除")

d = Dog("hh")
d.eat  # 定義了屬性方法已將方法變成靜態屬性
d.eat = "HHH"
d.eat  #這個是將“HHH”賦值

 類的其他特殊方法

1、Dog.__doc__    查看類的功能描述信息

 1 class Dog(object):
 2     '''定義dog類'''
 3     name = 'YI' # 類變量
 4     def __init__(self, name):
 5         self.name = name
 6         self.__food = None
 7 print(Dog.__doc__)  # 直接輸出這個類的功能
 8 
 9 結果:
10 定義dog類

 

2、__module__和__class__

__module__ 指的是當前操作對象所在的模塊

__class__  指的是當前當前操作對象的類是什么

3、__call__ 對象后面加括號,觸發執行

class Dog(object):
    '''定義dog類'''
    name = 'YI' # 類變量
    def __init__(self, name):
        self.name = name
        self.__food = None

    def __call__(self, *args, **kwargs):
        print("running call", args, kwargs)

d = Dog("jj")(1,2,3, num = 22)

或者

d = Dog("jj")  
d(1,2,3, num = 22)

結果:
running call (1, 2, 3) {'num': 22}

4、__init__  構造方法,通過類創建對象時,自動觸發執行

 5、__del__

說明:析構方法,當對象在內存中被釋放時,自動觸發執行

注:此方法一般無須定義,因為Python是一門高級語言,程序員在使用時無需關心內存的分配和釋放,因為此工作都是交給Python解釋器來執行,

所以,析構函數的調用是由解釋器在進行垃圾回收時自動觸發執行的

6、__dict__

1) 直接調用為給類進行實例化,通過類去調用    打印類里所有屬性和方法,不包括實例屬性

 1 class Dog(object):
 2     '''定義dog類'''
 3     name = 'YI' # 類變量
 4     def __init__(self, name):
 5         self.name = name
 6         self.__food = None
 7 
 8     def __call__(self, *args, **kwargs):
 9         print("running call", args, kwargs)
10 
11     def eat(self):
12         print("%s eating %s"%(self.name,self.__food))
13 
14     def eat(self, food):
15         print("sed to food:", food)
16         self.__food = food
17 
18     def eat(self):
19         del self.__food
20         print("food 變量已刪除")
21 print(Dog.__dict__)  # 打印出類里的所有屬性和方法

22 結果: 23 {'__doc__': '定義dog類', 'eat': <function Dog.eat at 0x00586078>, '__init__': <function Dog.__init__ at 0x001C5660>, '__dict__': <attribute '__dict__' of 'Dog' objects>, '__module__': '__main__', '__call__': <function Dog.__call__ at 0x00586150>, 'name': 'YI', '__weakref__': <attribute '__weakref__' of 'Dog' objects>}

2)通過實例名,打印出實例屬性,不包括類屬性

 1 class Dog(object):
 2     '''定義dog類'''
 3     name = 'YI' # 類變量
 4     def __init__(self, name):
 5         self.name = name
 6         self.__food = None
 7 
 8     def __call__(self, *args, **kwargs):
 9         print("running call", args, kwargs)
10 
11     def eat(self):
12         print("%s eating %s"%(self.name,self.__food))
13 
14     def eat(self, food):
15         print("sed to food:", food)
16         self.__food = food
17 
18     def eat(self):
19         del self.__food
20         print("food 變量已刪除")
21 d = Dog("kk")
22 print(d.__dict__)  # 實例名.__dict__打印出實例屬性,不包括類屬性
23 
24 結果:
25 {'_Dog__food': None, 'name': 'kk'}

7、__str__  如果一個類中定義了__str__方法,那么在打印 對象 時,輸出該方法的返回值

 1 class Dog(object):
 2     '''定義dog類'''
 3     name = 'YI' # 類變量
 4     def __init__(self, name):
 5         self.name = name
 6         self.__food = None
 7 
 8     def __call__(self, *args, **kwargs):
 9         print("running call", args, kwargs)
10 
11     def eat(self):
12         print("%s eating %s"%(self.name,self.__food))
13 
14     def eat(self, food):
15         print("sed to food:", food)
16         self.__food = food
17 
18     def eat(self):
19         del self.__food
20         print("food 變量已刪除")
21 
22     def __str__(self):
23         return "obj:%s"%self.name
24 d = Dog("kk")
25 print(d)  # 在打印 對象 時,輸出該方法的返回值
26 
27 結果:
28 obj:kk

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM