7-1三个装饰器函数

一 property的用法,将一个函数伪装成属性

 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装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量


#如果某一个类中的方法 并没有用到这个类的实例中的具体属性
# 只是用到了类中的静态变量 就使用类方法

 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这个参数了

通过@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()

 

posted @ 2018-05-25 09:42  huningfei  阅读(187)  评论(0编辑  收藏  举报
levels of contents