靜態方法
定義了靜態方法@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