zoukankan      html  css  js  c++  java
  • 三个面向对象相关的装饰器@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.")

  • 相关阅读:
    SGU 271 Book Pile (双端队列)
    POJ 3110 Jenny's First Exam (贪心)
    HDU 4310 Hero (贪心)
    ZOJ 2132 The Most Frequent Number (贪心)
    POJ 3388 Japanese Puzzle (二分)
    UVaLive 4628 Jack's socks (贪心)
    POJ 2433 Landscaping (贪心)
    CodeForces 946D Timetable (DP)
    Android Studio教程从入门到精通
    Android Tips – 填坑手册
  • 原文地址:https://www.cnblogs.com/daju/p/10228267.html
Copyright © 2011-2022 走看看