类方法:在普通方法上面加一个@classmethod(装饰器)
一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。
而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。
类方法对象也是可以调用的
# 类方法 class Dog: def __init__(self, nickname): self.nickname = nickname def run(self): # self 对象 print("{}在院子里跑来跑去".format(self.nickname)) @classmethod def test(cls): # cls class print(cls) # <class '__main__.Dog'>,可以看到cls就是类 print(cls.nickname) # 类中是没有nickname属性的 d = Dog('大黄') d.run() d.test()
特点:
1.定义需要依赖装饰器@classmethod
2.类方法中参数不是一个对象,而是类
如:
print(cls) # <class '__main__.Dog'>,可以看到cls就是类
3.类方法中只可以使用类属性,而不可以使用对象属性
为什么呢?
类方法的加载机制:类方法在对象还没有创建时候,就已经加载了
那类方法怎么调用呢?
可以通过类来调用,如,Dog.test()
# 类方法 class Dog: def __init__(self, nickname): self.nickname = nickname def run(self): # self 对象 print("{}在院子里跑来跑去".format(self.nickname)) @classmethod def test(cls): # cls class print(cls) # <class '__main__.Dog'>,可以看到cls就是类 # print(cls.nickname) # 类中是没有nickname属性的 Dog.test()
4.类方法可否使用普通方法?
不能!!!
但是如果类中的普通方法之间呢?
能!!!只要两个方法是平行的,同级的,就可以相互调用,因此可以在类中调用普通方法
# 类方法 class Dog: def __init__(self, nickname): self.nickname = nickname def run(self): # self 对象 print("{}在院子里跑来跑去".format(self.nickname)) def eat(self): print("吃饭...") self.run() # 类中同级方法的调用,需要通过self.方法名 @classmethod def test(cls): # cls class print(cls) # <class '__main__.Dog'>,可以看到cls就是类 dog = Dog('大黄') dog.eat()
类方法的作用:(不依赖于对象)
因为只能访问类属性和类方法,所以,可以在对象创建之前如果需要做一些功能(动作),就可以放在类方法中
私有属性只能通过类方法,在类内部进行访问
class Person: # 类的私有属性 __age = 18 @classmethod def update_age(cls): cls.__age = 20 print('----->类方法') @classmethod def show_age(cls): print('修改后的年龄是:', cls.__age) Person.update_age() Person.show_age()
class Person: # 类的私有属性 __age = 18 @classmethod def update_age(cls): cls.__age = 20 print('----->类方法') @classmethod def show_age(cls): print('修改后的年龄是:', cls.__age) # 私有属性,外界没有办法直接访问 print(Person.__age)