zoukankan      html  css  js  c++  java
  • property classmethod staticmethod的用法

    一:property的用法

    1,@property 能够将一个方法伪装成一个属性,它并不会让你的代码有什么逻辑上的提高,只是从调用者的角度上换了一种方式,使之看起来更合理。调用方法从原来的的对象名.方法名(),变成了对象名.方法名。

    class Person:
        def __init__(self,name,weight,height):
            self.name = name
            self.__height = height
            self.__weight = weight
        @property
        def bmi(self):
            return self.__weight / self.__height ** 2
    p = Person('ads',70,1.75)
    print(p.bmi)
    View Code

    2,方法伪装成的属性的修改

    class Person:
        def __init__(self,n):
            self.__name = n  # 私有的属性了
        @property
        def name(self):
            return self.__name
    
        @name.setter        # 重要程度 ***
        def name(self,new_name):
            if type(new_name) is str:
                self.__name = new_name
            else:
                print('您提供的姓名数据类型不合法')
    
    p = Person('alex')
    print(p.name)       #def name(self):
    p.name = 'alex_sb' #def name(self,new_name):
    print(p.name)       #def name(self):
    View Code

    3,方法伪装成的属性的删除

    class Person:
        def __init__(self,n):
            self.__name = n  # 私有的属性了
        @property            # 重要程度 ****
        def name(self):
             return self.__name
        @name.deleter
        def name(self):
            del self.__name
    
    p = Person('alex')
    print(p.name)
    del p.name
    View Code

    ps:

    @property --> func 将方法伪装成属性,只观看的事儿

    @func.setter --> func 对伪装的属性进行赋值的时候调用这个方法 一般情况下用来做修改

    @func.deleter --> func 在执行del 对象.func的时候调用这个方法 一般情况下用来做删除 基本不用

    二:classmethod的用法

    1,@classmethod ,类方法,可以直接被类调用,不需要默认传对象参数,只需要传一个类参数就可以了。

    class Goods:
        __discount = 0.8
        def __init__(self,name,origin_price):
            self.name = name
            self.__price = origin_price
    
        @property
        def price(self):
            return self.__price * Goods.__discount
    
        @classmethod
        def change_discount(cls,new_discount):
            cls.__discount = new_discount
    
    Goods.change_discount(1)
    # 不依赖对象的方法 就应该定义成类方法 类方法可以任意的操作类中的静态变量
    # 如果要改变折扣 是全场的事情 不牵扯到一个具体的物品 所以不应该使用对象来调用这个方法
    apple = Goods('apple',5)
    banana = Goods('banana',8)
    print(apple.price)
    print(banana.price)
    View Code

    三:staticmethod的用法

    当一个方法要使用对象的属性时 就是用普通的方法

    当一个方法要使用类中的静态属性时 就是用类方法

    当一个方法要既不使用对象的属性也不使用类中的静态属性时,就可以使用staticmethod静态方法

    class Student:
        def __init__(self,name):pass
    
        @staticmethod
        def login(a):
            # login就是一个类中的静态方法 静态方法没有默认参数 就当成普通的函数使用即可
            user = input('user :')
            if user == 'alex':
                print('success')
            else:
                print('faild')
    
    Student.login(1)
    View Code

     

  • 相关阅读:
    jupyter notebook代码添加行号(菜单中点击view后没有toggle line numbers选项)
    深度学习:tensorflow中激励函数的实现
    深度学习:padding、卷积、stride的计算
    深度学习:mAP(mean average precision)
    java实现桶排序
    java 数组实现队列和栈
    五步学习法
    技术团队组织架构
    Redis的高可用:哨兵和集群
    Redis限流的实现方式有3种
  • 原文地址:https://www.cnblogs.com/leiwei123/p/8874366.html
Copyright © 2011-2022 走看看