一 property的用法,將一個函數假裝成屬性app
1 #第一種寫法: 2 from math import pi 3 class Circle: 4 def __init__(self,r): 5 self.r=r 6 def mj(self): 7 return pi*self.r**2 8 def zc(self): 9 return 2*pi*self.r 10 c1=Circle(3) 11 print(c1.mj()) 12 13 #第二種寫法:用property 將一個函數假裝成爲屬性 14 class Circle: 15 def __init__(self,r): 16 self.r=r 17 @property 18 def mj(self): 19 return pi*self.r**2 20 @property 21 def zc(self): 22 return 2*pi*self.r 23 c1=Circle(3) 24 print(c1.mj) 25 26 27 # property 跟__私有屬性的結合 如:蘋果打折的問題 28 class Goods(): 29 def __init__(self,price,discount): 30 self.__price=price 31 self.discount=discount 32 @property 33 def price(self): #現有的價格 34 return self.__price * self.discount 35 @price.setter #設置一個新的屬性即新的價格 36 def price(self,newprice): 37 self.__price=newprice 38 @price.deleter #刪除一個價格 39 def price(self): 40 del self.__price 41 42 apple=Goods(8,0.7) 43 print(apple.price) 44 apple.price=10 45 print(apple.price) 46 print(apple.__dict__) 47 del apple.price 48 print(apple.__dict__)
二 classmethod 函數
類方法經過@classmethod裝飾器實現,類方法和普通方法的區別是, 類方法只能訪問類變量,不能訪問實例變量spa
#若是某一個類中的方法 並無用到這個類的實例中的具體屬性
# 只是用到了類中的靜態變量 就使用類方法code
1 class Dog(object): 2 def __init__(self,name): 3 self.name = name 4 5 @classmethod 6 def eat(self): 7 print("%s is eating" % self.name) 8 9 10 11 d = Dog("ChenRonghua") 12 d.eat() 13 14 執行報錯以下,說Dog沒有name屬性,由於name是個實例變量,類方法是不能訪問實例變量的
此時能夠定義一個類變量,也叫name,看下執行效果對象
class Dog(object): name = "我是類變量" def __init__(self,name): self.name = name @classmethod def eat(self): print("%s is eating" % self.name) d = Dog("ChenRonghua") d.eat() 此次沒報錯
1 # classmethod 2 class Person: 3 Country='中國人'
4 @classmethod #把func變成了一個類方法 5 def func(cls): #cls指向了類的內存空間 6 print('當前角色的國家是%s' %cls.Country) 7 # alex=Person() 8 # alex.func() 9 10 Person.func()
三 staticmethod 靜態方法不須要self這個參數了blog
經過@staticmethod裝飾器便可把其裝飾的方法變爲一個靜態方法,什麼是靜態方法呢?其實不難理解,普通的方法,能夠在實例化後直接調用,而且在方法裏能夠經過self.調用實例變量或類變量,但靜態方法是不能夠訪問實例變量或類變量的,一個不能訪問實例變量和類變量的方法,其實至關於跟類自己已經沒什麼關係了,它與類惟一的關聯就是須要經過類名來調用這個方法內存
1 # staticmethod 2 ## 若是 一個方法 既不會用到對象中的屬性也不會用到類中的屬性 3 # 就應該被定義爲一個靜態方法 4 5 class Student: 6 @staticmethod #不須要實例化一個學生能夠直接調用login登陸方法 7 def login(): 8 name=input('name:') 9 pwd=input('pwd:') 10 if name =='hu' and pwd =='123': 11 print('登陸成功') 12 13 Student.login()