#classmethod staticmethod property
#三个装饰器函数
#part1 Property 将方法为伪装成一个属性
#圆形类
from math import pi
class Circle:
def __init__(self,r):
self.r=r
def area(self):
return self.r**2*pi
def perimeter(self):
return self.r*2*pi
c=Circle(3)
#求面积,调用area()方法:
print(c.area())
#但是,一般情况下,方法代表的是一个动作或者技能
# 而面积,名次,应该是一个属性,而不是一个方法
#所以,如何将方法为伪装成一个属相呢 在函数前面@property
class Circle:
def __init__(self,r):
self.r=r
@property
def area(self):
return self.r**2*pi
@property
def perimeter(self):
return self.r*2*pi
c=Circle(3)
print(c.area)
print(c.perimeter)
c.r=4
print(c.area)
print(c.perimeter)
#Part2 property 跟__私有属性结合
class Goods:
def __init__(self,price,discount):
self.__price=price
self.discount=discount
@property #将方法修改成属性
def price(self):
print('求折后价')
return self.__price*self.discount
@price.setter #修改属性的参数
def price(self,new_price):
print('重新赋值')
self.__price=new_price
@price.deleter #删除属性参数
def price(self):
del self.__price
apple=Goods(7,0.8)
print(apple.price)
apple.price=10 #执行price.setter功能
print(apple.price)
del apple.price #触发删除属性的方法,price.deleter方法
print(apple.__dict__)
#Part3 classmethod 把方法变成类方法
#如果一个类中的方法并没有用到这个类的实例中的具体属性,
# 只是用了类中的静态变量,就用类方法
class Person:
Country='中国人'
@classmethod #把func变成了一个类方法
def func(cls): # cls是指向类的内存空间
print('当前角色为%s'%cls.Country)
### alex=Person()
Person.func() #不需要实例,直接调用该方法
#Part4 staticmethod
#如果一个方法既不会用对象的属性,也不会用到类中的属性,就应该被定义为静态方法
class Student:
@staticmethod #定义一个静态方法,不需要传参
def login():
name=input('name:')
pwd=input('pwd:')
if name=='alex'and pwd=='123':
print('实例化')
Student.login()
转载于:https://www.cnblogs.com/lixiaoxuan/articles/9068402.html