zoukankan      html  css  js  c++  java
  • Python-内置函数_@propery、@classmethod、@staticmethod详解

    一、@property(fget = None, fset = None, fdel = None, doc = None): 作为一个装饰器,负责把一个方法变成属性调用如果c是C的实例对象,c.x将调用getter属性,c.x = value获取setter属性,del c.x将调用deleter属性,doc将给出property属性的文档字符串,即注释说明

    class Parrot:
        def __init__(self):
            self._voltage = 10000
    
        @property
        def voltage(self):
            '''Get the current voltage'''
            return self._voltage
    
        @voltage.setter
        def s_vol(self, value):
            '''set the current vol'''
            self._voltage = value
    
        @voltage.deleter
        def d_vol(self):
            '''del the current vol'''
            del self._voltage
    
    p = Parrot()
    print(p.voltage)
    p.s_vol = 20000
    print(p.s_vol)
    p.s_vol = 30000
    print(p.s_vol)
    class Student(object):
        @property
        def score(self):
            return self._score
    
        @score.setter
        def score1(self, value):
            if not isinstance(value, int):
                raise ValueError('score must be an integer!')
            if value < 0 or value > 100:
                raise ValueError('score must between 0~100')
            self._score = value
    
        @score.deleter
        def score2(self):
            del self._score
    
    s = Student()
    s.score1 = 60
    print(s.score)    #返回60
    s.score1 = 90
    print(s.score)     #返回90

     二、@classmethod: 修饰符对应的函数不需要实例化,不需要self参数,但第一个参数需要是表示自身类的cls参数,可以来调用类的属性,类方法,实例化对象等

    class A(object):
    
        #属性默认为类属性(可以直接被类调用)
        num = 100
    
        #实例化方法(必须实例化类之后才能被调用,即A().func())
        def func(self):
            print('func')
            print(self)      #返回<__main__.A object at 0x7fb9c8111a30>,self表示实例化类后的内存地址id
    
        @classmethod #类方法,不需要实例化就可以被类本身调用,即A.func1()
        def func1(cls):    #cls表示没有被实例化的类本身
            print('func1')
            print(cls)
            print(cls.num)
            cls().func()
    
        #不传递默认self参数的方法(该方法也是可以直接被类调用,但是这样做不标准)
        def func2():
            print('func2')
            print(A.num)  #属性是可以直接用类本身调用
    
    A.func1()
    '''
    返回结果:
    func1
    <class '__main__.A'>
    100
    func
    <__main__.A object at 0x7f84c81b9a30>
    '''
    A.func2()
    #返回结果:
    # func2
    # 100
    
    A().func()
    #返回结果:
    # func
    #<__main__.A object at 0x7f9578179a30>

    三、@staticmethod:   返回函数的静态方法,相当于普通的函数,不需要强制传递self或者其它参数,如果有参数,要求是可调用的,class也可以。
    可以实例化调用A().func(),也可以不实例化调用A.func()

    class C(object):
    
        @staticmethod
        def f():
            print('这是一个静态方法')
    
    
    C.f()   #返回: 这是一个静态方法
    C().f()  #返回: 这是一个静态方法
    
    
    class C1(object):
        @staticmethod
        class C2(object):
            def __init__(self, val = 1):
                self.val = val
    
            def shout(self):
                print('这是一个静态方法参数:%s '% self.val)
    
    C1.C2().shout()       #返回结果: 这是一个静态方法参数:1
    
    三十六般武艺,七十二般变化,修练出个人品牌并发出光芒
  • 相关阅读:
    (转)Python中的__init__和__new__
    PEP8
    python lstrip()函数
    python中的生成器跟迭代器
    callback
    关于0.0.0.0这个ip的疑问
    Python import中相对路径的问题
    python读取excel
    git本地管理多个密钥/账户
    词法分析之有确定、不确定自动机及其生成器
  • 原文地址:https://www.cnblogs.com/deeptester-vv/p/15182477.html
Copyright © 2011-2022 走看看