@property    

# property是一个装饰器函数 ,作用:将一个方法伪装成属性
# 所有的装饰器函数都怎么用? 在函数、方法、类的上面一行直接@装饰器的名字
# 装饰器的分类:
# 装饰函数
# 装饰方法 : property
# 装饰类
class Student:
    def __init__(self,name,age):
        self.__name = name
        self.age = age
    @property   # 将一个方法伪装成一个属性
    def name(self):
        return self.__name
zhuge = Student('诸葛',20)
print(zhuge.name)

计算一个圆的面积和周长

from math import pi
class Circle:
    def __init__(self,r):
        self.r = r
    @property
    def area(self):
        return self.r**2*pi
    @property
    def perimeter(self):
        return 2*self.r *pi
c1 = Circle(10)
print(c1.area)
print(c1.perimeter)

Goods的实例

class Goods:
    __discount = 0.8
    def __init__(self,price):
        self.__price = price
    @property
    def price(self):
        return self.__price*Goods.__discount
    @price.setter
    def price(self,new):
        self.__price = new
    @price.deleter
    def price(self):
        del self.__price    # 真的删除,可以赋值
apple = Goods(10)
print(apple.price)

apple.price = 8
print(apple.price)
# 只有当被property装饰的方法
# 又实现了一个同名方法
# 且被setter装饰器装饰了
# 且在对被装饰的方法赋值的时候 就可以出发被setter装饰器方法
# 作用:用来保护一个变量,在修改的时候能够添加一些保护条件

# 一个方法被伪装成属性之后
# 应该执行一个属性的增删改查的操作
# 那么增删和修改,就对应着被setter装饰的方法,这个方法又一个必传的参数new,表示赋值的时候等号后的值
# 删除一个属性 对应着 被deleter装饰的方法,这个方法并不能在执行的时候真的被删除,而是在代码中执行什么就有什么效果。
@classmethod   类方法
class Goods:
    __discount = 0.8
    def __init__(self,price):
        self.__price = price
    @property
    def price(self):
        return self.__price*Goods.__discount
    @classmethod
    def chang_discount(cls,new):            # 类方法
        cls.__discount = new
apple = Goods(10)
banana = Goods(20)
Goods.chang_discount(0.7)          # 改变了类中私有属性
# print(Goods.__dict__)

print(apple.price)
print(banana.price)

特点:只使用类中的资源,且这个资源可以直接用类名引用的使用,那这个方法应该被改为一个方法

 

# @staticmethod  将类外面的函数 拿到里面

class Student:               # 静态方法
    @staticmethod            # 可以把外面的函数拿到类里面写
    def login(usr,pwd):      # 相当于将他变成普通方法,可以不用self传参。通过类名点方法名调用
        print('in login',usr,pwd)
Student.login('user','pwd')