面向对象之类方法
类方法:在普通方法上面加一个@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)

5.类属性和对象属性
类属性:

对象属性:


浙公网安备 33010602011771号