7-1三個裝飾器函數

一 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()
相關文章
相關標籤/搜索