首页 > 代码库 > 面向对象补充之方法

面向对象补充之方法

一、静态方法 @staticemethod  
只是名义上归类管理, 实际上在静态方法里访问不了类或实例中的任何属性。
实例:
class Dog(object):
    ‘‘‘这个类是描述狗这个对象的‘‘‘

    def __init__(self,name):
        self.name = name

    @staticmethod #实际上跟类没什么关系了,只是名义上归类管理, 实际上在静态方法里访问不了类或实例中的任何属性
    def eat(self):
        print("%s is eating %s" %(self.name,‘d‘))

  
d=Dog(‘doggie‘)
d.eat()

  返回:

技术分享

在类的动态方法前面加上了“@staticmethod”之后,这个动态方法就已经和类没有什么关系,self不会自动传入。

 

二、类方法 @classmethod  
只能访问类变量,不能访问实例变量
实例:
class Dog(object):
    ‘‘‘这个类是描述狗这个对象的‘‘‘
    n=‘我不是实例变量‘

    def __init__(self,name):
        self.name = name

    @classmethod  #只能访问类变量,不能访问实例变量
    def p(self):
        print(‘我是类变量,%s‘%self.n)   #注意,此处只能调用类变量,传入的变量一定要写成self.var的格式。

    def eat(self):
        print(‘%s is eating...‘%self.name)



d=Dog(‘doggie‘)
d.eat()
d.p()    #没有被@classmethod的方法可以正常调用实例变量。

  返回:

技术分享

如果上面实例中的d.eat()也被“@classmethod”方法,那么则会返回下面的错误:

技术分享

 




三、属性方法 @property
把一个方法变成一个静态属性

 

class Dog(object):
    ‘‘‘这个类是描述狗这个对象的‘‘‘

    def __init__(self,name):
        self.name = name

    @property
    def eat(self):
        print(‘%s is eating...‘%self.name)

d=Dog(‘doggie‘)
d.eat  

  返回:

技术分享

注意:由于“@property”方法已经把d.eat方法变成了一个静态属性,如果没有“@property”方法,执行d.eat,不会调用执行d.eat方法;但由于“@property”将d.eat方法转变为一个静态属性,则不能通过d.eat()调用,会返回“TypeError: ‘NoneType‘ object is not callable”。

如果被装饰的方法中不需要传入参数,则可以通过d.eat执行。

 

面向对象补充之方法