面向对象之类方法

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

原文地址:https://www.cnblogs.com/GumpYan/p/12358519.html