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)


  • 相关阅读:
    [硬件驱动_蓝牙]蓝牙Bluez的编程实现
    二分查找
    LeetCode-35.Search Insert Position
    LeetCode-34.Find First and Last Position of Element in Sorted Array
    LeetCode-704.Binary Search
    剑指offer-最小的k个数
    树的各种遍历
    LeetCode-912.Sort an Array
    排序
    LeetCode-209.Minimum Size Subarray Sum
  • 原文地址:https://www.cnblogs.com/1832921tongjieducn/p/10957989.html
Copyright © 2011-2022 走看看