python 面向对象之类方法

发布时间:2018-04-07 21:05:16编辑:admin阅读(4755)

    类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量


    举个例子

    class Dog(object):
        def __init__(self, name):
            self.name = name
    
        @classmethod  # 把eat方法变为类方法
        def eat(self): # 吃东西
            print("%s is eating" % (self.name))
    
    
    d = Dog("二哈")
    d.eat()

    执行报错:

    AttributeError: type object 'Dog' has no attribute 'name'

    意思是:'Dog'类型的对象没有属性名称

    不对啊,上面声明了name属性了!为什么呢?


    那么引用类变量呢?

    class Dog(object):
        n = 'kk' #类变量
        def __init__(self, name):
            self.name = name
    
        @classmethod  # 把eat方法变为类方法
        def eat(self): # 吃东西
            print("%s is eating" % (self.n))
    
    
    d = Dog("二哈")
    d.eat()

    执行输出:

    kk is eating


    引用类变量,发现没有报错。

    再将n改到实例变量呢?

    class Dog(object):
        def __init__(self, name):
            self.name = name
            self.n = 'kk' #实例变量
    
        @classmethod  # 把eat方法变为类方法
        def eat(self): # 吃东西
            print("%s is eating" % (self.n))
    
    
    d = Dog("二哈")
    d.eat()

    执行报错:

    AttributeError: type object 'Dog' has no attribute 'n'


    总结:

    类方法只能访问类变量,不能访问实例变量


    比如说实例和类,有同样的变量,它需要强制访问类变量的时候

    就可以用到类方法了。


    我们要写一个只在类中运行而不在实例中运行的方法. 如果我们想让方法不在实例中运行,可以使用类方法。


关键字