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

    @property    

    # property是一个装饰器函数 ,作用:将一个方法伪装成属性
    # 所有的装饰器函数都怎么用? 在函数、方法、类的上面一行直接@装饰器的名字
    # 装饰器的分类:
    # 装饰函数
    # 装饰方法 : property
    # 装饰类
    class Student:
        def __init__(self,name,age):
            self.__name = name
            self.age = age
        @property   # 将一个方法伪装成一个属性
        def name(self):
            return self.__name
    zhuge = Student('诸葛',20)
    print(zhuge.name)

    计算一个圆的面积和周长

    from math import pi
    class Circle:
        def __init__(self,r):
            self.r = r
        @property
        def area(self):
            return self.r**2*pi
        @property
        def perimeter(self):
            return 2*self.r *pi
    c1 = Circle(10)
    print(c1.area)
    print(c1.perimeter)

    Goods的实例

    class Goods:
        __discount = 0.8
        def __init__(self,price):
            self.__price = price
        @property
        def price(self):
            return self.__price*Goods.__discount
        @price.setter
        def price(self,new):
            self.__price = new
        @price.deleter
        def price(self):
            del self.__price    # 真的删除,可以赋值
    apple = Goods(10)
    print(apple.price)
    
    apple.price = 8
    print(apple.price)
    # 只有当被property装饰的方法
    # 又实现了一个同名方法
    # 且被setter装饰器装饰了
    # 且在对被装饰的方法赋值的时候 就可以出发被setter装饰器方法
    # 作用:用来保护一个变量,在修改的时候能够添加一些保护条件

    # 一个方法被伪装成属性之后
    # 应该执行一个属性的增删改查的操作
    # 那么增删和修改,就对应着被setter装饰的方法,这个方法又一个必传的参数new,表示赋值的时候等号后的值
    # 删除一个属性 对应着 被deleter装饰的方法,这个方法并不能在执行的时候真的被删除,而是在代码中执行什么就有什么效果。
    @classmethod   类方法
    class Goods:
        __discount = 0.8
        def __init__(self,price):
            self.__price = price
        @property
        def price(self):
            return self.__price*Goods.__discount
        @classmethod
        def chang_discount(cls,new):            # 类方法
            cls.__discount = new
    apple = Goods(10)
    banana = Goods(20)
    Goods.chang_discount(0.7)          # 改变了类中私有属性
    # print(Goods.__dict__)
    
    print(apple.price)
    print(banana.price)

    特点:只使用类中的资源,且这个资源可以直接用类名引用的使用,那这个方法应该被改为一个方法

    # @staticmethod  将类外面的函数 拿到里面

    class Student:               # 静态方法
        @staticmethod            # 可以把外面的函数拿到类里面写
        def login(usr,pwd):      # 相当于将他变成普通方法,可以不用self传参。通过类名点方法名调用
            print('in login',usr,pwd)
    Student.login('user','pwd')
    
    


  • 相关阅读:
    python的垃圾回收机制
    生成器
    装饰器
    模块与包
    MES实施会有哪些情况?为你介绍两种常见的类型
    中国智慧工厂未来发展及趋势几何?这里给你讲个清楚
    未来智能工厂是什么样?这五种产业必不可少
    制造企业非常头疼的插单问题,本文给你这些实用建议,第7点最具价值
    MES选型很困惑?避开这三个禁忌!
    如何适应应用场景?高级排程系统的功能如此强大!
  • 原文地址:https://www.cnblogs.com/youhongliang/p/9562452.html
Copyright © 2011-2022 走看看