• 三个面向对象相关的装饰器@property@staticmathod@classmethod


    @property

    先看实例:

     1 from math import pi
     2 class Circle:
     3     def __init__(self,r):
     4         self.r = r
     5     @property
     6     def perimeter(self):
     7         return 2*pi*self.r
     8     @property
     9     def area(self):
    10         return self.r**2*pi
    11 
    12 # c1 = Circle(5)
    13 # print(c1.area)     # 圆的面积
    14 # print(c1.perimeter) # 圆的周长

    上边求圆的周长和圆的面积的类中,圆的周长和面积本来应该是属性,可是在一般的求解中,我们却要使用实例.方法名()的形式来求出结果,显然与真实世界对于属性的定义有些矛盾。现在可以通过在方法前@property,将此其伪装成一个属性,这样我们可以通过

    实例.方法来调用,效果与实例.方法名() 是一样的。      

    在看下边这个实例:

       

    class Person:
         def __init__(self,name):
             self.__name = name
    
         @property
         def name(self):
             return self.__name
    
         @name.deleter
         def name(self):
             del self.__name
    
         @name.setter
         def name(self,new_name):
             self.__name = new_name

    类中的方法名本来是不能用相同名字的,但只要使用@property加在someone之前,并且在再此定义此someone前,@someone.setter,@someone.deleter。这样在类实例化化后,调用对象.someone就相当于调用@property下的someone方法。

    调用对象.someone=sthing就相当于调用@someone.setter下的方法,并且传进去一个参数sthing。调用del.对象.someone相当于调用@someone.deleter下的方法。

    说到@property就要提到property这个函数 请看例子:

     1 class C(object):
     2     def __init__(self):
     3         self._x = None
     4  
     5     def getx(self):
     6         return self._x
     7  
     8     def setx(self, value):
     9         self._x = value
    10  
    11     def delx(self):
    12         del self._x
    13  
    14     x = property(getx, setx, delx, "I'm the 'x' property.")

    以下是 property() 方法的语法:

    classproperty([fget[, fset[, fdel[, doc]]]])
    • fget -- 获取属性值的函数
    • fset -- 设置属性值的函数
    • fdel -- 删除属性值函数
    • doc -- 属性描述信息

    返回新式类属性,效果与@property相同。

     

    @classmethod

    @classmethod   # 把一个方法 变成一个类中的方法,这个方法就直接可以被类调用,不需要依托任何对象。

    当这个方法的操作只涉及静态属性的时候 就应该使用classmethod来装饰这个方法。

     

    class someone:
         __sthing = "abc"  #定义一个类的私有属性
    
        @classmethod   # 把一个方法 变成一个类中的方法
        def change_sthing(cls,new_sthing):  # 修改属性
            cls.__sthing = new_sthing

     

    类似于实例方法要传个self代表实例对象,此类方法在传参时,要传一个形参代表当前类,默认cls。

    @staticmathod

     

     在完全面向对象的程序中,

     如果一个函数 既和对象没有关系 也和类没有关系 那么就用staticmethod将这个函数变成一个静态方法

     

    class Login:
        def __init__(self,name,password):
            self.name = name
            self.pwd = password
        def login(self):pass
    
        @staticmethod
        def get_usr_pwd():   # 静态方法
            usr = input('用户名 :')
            pwd = input('密码 :')
            Login(usr,pwd)

     

    静态方法就是一个写在类里的普通函数。

    对象可以调用类方法和静态方法

     一般情况下 推荐用类名调用

    类方法 有一个默认参数 cls 代表这个类  cls

     静态方法 没有默认的参数 就象函数一样

    通过类.静态方法调用时不会实例化。

     

     

     

     

    classC(object): def__init__(self): self._x = Nonedefgetx(self): returnself._xdefsetx(self, value): self._x = valuedefdelx(self): delself._xx = property(getx, setx, delx, "I'm the 'x' property.")

  • 相关阅读:
    高校教师职评
    高校教师曝职评内幕:混行政圈比科研圈更重要
    【50.88%】【Codeforces round 382B】Urbanization
    【64.22%】【codefoces round 382A】Ostap and Grasshopper
    【u253】售货厅
    【u250】manhattan
    【19.77%】【codeforces 570D】Tree Requests
    【t063】最聪明的机器人
    Java Web整合开发(38) -- Log4J
    公网 or 内网
  • 原文地址:https://www.cnblogs.com/daju/p/10228267.html
Copyright © 2020-2023  润新知