三个面向对象相关的装饰器@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.")

posted @ 2019-01-06 17:11  曜有丨光  阅读(299)  评论(0编辑  收藏  举报