zoukankan      html  css  js  c++  java
  • 面向对象中的一些装饰器

    '''# 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)


  • 相关阅读:
    思念
    空白
    curl json string with variable All In One
    virtual scroll list All In One
    corejs & RegExp error All In One
    socket.io All In One
    vue camelCase vs PascalCase vs kebabcase All In One
    element ui 表单校验,非必填字段校验 All In One
    github 定时任务 UTC 时间不准确 bug All In One
    input range & color picker All In One
  • 原文地址:https://www.cnblogs.com/1832921tongjieducn/p/10957989.html
Copyright © 2011-2022 走看看