装饰器property的简单运用

property函数:在类中使用,将类中的方法伪装成一个属性

使用方法:在函数,方法,类的上面一行直接@装饰器的名字

装饰器的分类:

  装饰器函数

  装饰器方法:property

  装饰类

class Student:
    def __init__(self,name):
        self.__name = name
    @property
    def name(self):
        return self.__name
    @name.setter       #设置,修改(自我理解)
    def name(self,new_name):  
        if type(new_name) is str:  #只有当修改的值为str类型,才能被修改
            self.__name = new_name
a1 = Student("诸葛")
print(a1.name)      #诸葛
a1.name = "睿智"
print(a1.name)      #睿智
a1.name = 123
print(a1.name)      #睿智

setter的用法:

  setter是只有被property方法之后的,又实现了一个同名的方法,且被setter装饰器装饰了

   它的作用是用来保护一个变量,在修改的时候能够添加一些保护条件。

deleter的用法:

  一个方法被伪装成属性后,应该可以执行一个属性的增删改查操作,

  所以deleter就是对应着被deleter装饰的方法,这个方法并不是只为了删除这个属性,而是你在代码中执行什么就有什么效果。

class Goods:
    __discount = 0.8
    def __init__(self,price):
        self.__price = price
    @property
    def price(self):
        return self.__price * self.__discount
    @price.setter
    def price(self,new):
        if type(new) is int:
            self.__price =  new
    @price.deleter
    def price(self):
        del self.__price
apple = Goods(10)
print(apple.price)      #8.0
print(apple.__dict__)   #{'_Goods__price': 10}
apple.price = 20        #将__price的值进行修改
print(apple.price)      #16
print(apple.__dict__)   #{'_Goods__price': 20}
del apple.price         #删除
print(apple.__dict__)    #{}

deleter通常用在

class A:
    def __init__(self):
        self.__f = open('aaa','w')

    @property
    def f(self):
        return self.__f

    @f.deleter
    def f(self):
        self.__f.close()    #先关闭文件
        del self.__f          #删除文件

@classmethod 将类中的方法变成类方法,为了不创建类对象,而直接用类方法修改静态私有属性。用法如下

  只使用类中的资源,且这个资源可以直接用类名引用的使用,那这个方法在方法上面@classmethod将这个方法变成类方法

class Goods:
    __discount = 0.8    #静态私有属性
    def __init__(self,price):
        self.__price = price  #私有对象属性
        self.name = "apple"     #对象属性
    @property
    def price(self):
        return self.__price *Goods.__discount

    @classmethod        #类方法
    def change_disount(cls,new):     #cls 表示Goods这个类
        cls.__discount = new    #对Goods中的静态私有属性进行修改
print(Goods.__dict__)       # '_Goods__discount': 0.8,
Goods.change_disount(0.7)
print(Goods.__dict__)       #'_Goods__discount': 0.7,                     

@staticmethod 静态方法  (如果函数要在类中使用,就用静态方法)

class Student:

    @staticmethod    #在类中创建函数
    def login(usr,pwd):
        print('IN LOGIN',usr,pwd)


Student.login('user','pwd')    

 

总结

#  类:
    # 静态属性         类  所有的对象都统一拥有的属性
    # 类方法           类  如果这个方法涉及到操作静态属性、类方法、静态方法                            cls 表示类
    # 静态方法         类  普通方法,不使用类中的命名空间也不使用对象的命名空间   : 一个普通的函数    没有默认参数
    # 方法             对象                                                                            self 表示对象
    # property方法     对象                                                                            slef 表示对象

isinstance(a,A)  判断对象与类直接的关系

issubclass(A,B)     判断类与类之间的关系

class A:pass
class B(A):pass
a = A()
b = B()
# print(type(a) is A)     #True
# print(type(b) is B)     #True
# print(type(b) is A)     #False

# print(isinstance(a,A))  #True   #isinstance判断对象a与类A的关系(自我理解)
# print(isinstance(b,A))  #True
# print(isinstance(a,B))  #False
print(issubclass(B,A))  #True
print(issubclass(A,B))  #False  判断类与类之间的关系

 

  

  

posted @ 2018-08-30 21:19  云丛  阅读(935)  评论(0编辑  收藏  举报