#装饰器
# @property、@classmethod、@staticmethod
# method 方法--函数 由实例化对象调用
# property 伪装属性的方法 由实例化对象调用
# classmethod 类方法 由类调用,只使用类中的静态变量
# staticmethod 静态方法 由类调用,既不会用到对象的属性也不会用到类的属性
#@property 1、将方法伪装成属性;2、修改私有变量且添加处理逻辑;3、
# 1、
#圆 半径r 面积S 周长C
import cProfile
from math import pi
class Circle:
def __init__(self, r):
self.r = r
def S(self):
return self.r**2*pi
@property
def C(self):
return 2*pi*self.r
cir = Circle(5)
print(cir.r)# 5
print(cir.S())# 78.53981633974483 带括号是调用方法
print(cir.S)# 去掉括号当变量调用时打印对象 <bound method Circle.S of <__main__.Circle object at 0x7ff01f892fd0>>
print(cir.C)# 31.41592653589793 用@property 装饰后方法伪装成属性
# 2、修改私有变量且添加处理逻辑
class Person:
def __init__(self, name):
self.__name = name
@property
def name(self):
return self.__name
Jerry = Person('Jerry')
print(Jerry.name)# Jerry
# Jerry.name = 111 # 伪装变量不能修改
class P:
def __init__(self, name):
self.__name = name
@property
def name(self):
return self.__name
@name.setter# 方法名.setter 三个方法名必须一致
def name(self, new):
if type(new) is str:
self.__name = new
P = P('Jerry')
print(P.name)# Jerry
P.name = 'aaa'
print(P.name)# aaa
# 3、伪装属性删除
class Demo:
def __init__(self, path):
self.__f = open(path, 'w')
@property
def f(self):
return self.__f
@f.deleter
def f(self):
self.close()
del self.__f
def write(self, content):
self.f.write(content)
def close(self):
self.f.close()
obj = Demo('1.txt')
obj.write('test')
obj.close()
del obj.f # f被删除
# print(obj.f)
#@classmethod
class shop:
__discount = 0.8
def __init__(self, price):
self.__price = price
@property
def price(self):
return round(self.__price * shop.__discount, 2)
@price.setter
def price(self, new_price):
self.__price = new_price
@classmethod
def change_discount(cls, new_discount):# cls 指引用当前类
shop.__discount = new_discount
@staticmethod
def stat(name, count):# 没有self,不依赖类, @staticmethod 装饰可以不用,但规范还是建议使用
name = name
count = count
print(name, count)
shop.change_discount(1)# 被classmethod 装饰后可直接被调用
s = shop(10)
print(s.price)
shop.stat('pig', 10)# 静态方法可以直接调用