面向对象中的一些装饰器

'''# BMI指数应用实例'''
"""
成人的BMI数值:
过轻:低于18.5
正常:18.5-23.9
过重:24-27
肥胖:28-32
非常肥胖, 高于32
  体质指数(BMI)=体重(kg)/ 身高^2(m)
  EX:70kg÷(1.75×1.75)=22.86
"""
class User:
def __init__(self,height,weight):
self.height = height
self.weight = weight
def bmi(self):
return self.weight/(self.height**2)

user = User(1.83,75)
print('%2f' %user.bmi())
###这里 一个人的BMI指数本来应该是一个属性,而不是一个函数,不是一个功能
##这里我们用一个property装饰这个功能函数,就可以将其伪装成一个属性,伪装成一个变量
class User:
def __init__(self,height,weight):
self.height = height
self.weight = weight
@property
def bmi(self):
return self.weight/(self.height**2)

user = User(1.65,85)
print(user.bmi)


print('=============================================================================')

###这里我们将一个属性的增删改查统一成一个函数,
class User:
def __init__(self,name,age):
self.__name = name
self.__age = age

@property
def name(self):
return self.__name

@name.setter
def name(self,val):
if not isinstance(val,str):
print('name字段必须是str类型')
self.__name = val

@name.deleter
def name(self):
print('不能删啊 老弟!')

obj = User('jsaon',18)
print(obj.name)
obj.name = 'egon'
print(obj.name)
del obj.name

print('=============================================================================')
##或者采用下面这种写法,这种做法相对比较古老:
class User:
def __init__(self,name,age):
self.__name = name
self.__age = age


def get_name(self):
return self.__name


def change_name(self,val):
if not isinstance(val,str):
print('name字段必须是str类型')
self.__name = val

def del_name(self):
print('不能删啊 老弟!')

name = property(get_name,change_name,del_name)
#################注意这种方法必须用get change del 分别对应 查看 改变 删除
obj = User('jsaon',18)
print(obj.name)
obj.name = 'egon'
print(obj.name)
del obj.name



'''
classmethod :类方法,绑定给类使用的,使用的时候,会自动将调用该方法的类名作为第一个参数传入
绑定给对象的方法:什么装饰器也不加,就表示是给对象使用的方法,使用的时候,会自定将调用者对象作为第一个参数传入
staticmethod :静态方法,就是既不是绑定给对象使用的,也不是绑定给类使用的,调用的时候不会自动传入任何参数

具体使用如下:
'''
class User:
def __init__(self,name):
self.name = name

def func(self):
print('func')

@classmethod
def foo(cls):
print(cls)

@staticmethod
def bar(x,y):
print('bar')
obj = User('jason')
obj.func()
User.foo()
obj = User('jason')
User.bar(1,2)
obj.bar(1,2)


猜你喜欢

转载自www.cnblogs.com/1832921tongjieducn/p/10957989.html