Python类的基本操作

Python类的基本操作

  1. 以双下划线开头的变量或方法是私有变量/方法,除下面这个特殊
  2. xx形式定义的变量,可以被外部访问,称为特殊属性
  3. python不支持重载,如果写多个同名函数,则会以最后一个为准

Python类中的@classmethod、@staticmethod 装饰方法

  • @classmethod,用来修饰类方法,可以在使用时候只与类交互,而不用实例化类后才能用
  • @staticmethod,用来修饰静态方法,使用在有些与类相关函数,但不使用该类或该类的实例。如更改环境变量、修改其他类的属性等。修饰的方法是放在类外的函数,我们为了方便将他移动到了类里面,它对类的运行无影响。
  • @property,将类方法转换为只读属性,即将类方法转变为类属性

二者最大区别是,classmethod必须传入类的对象作为第一个参数,staticmethod则不需要传递任何参数

cls 表示类,self 表示实例;

cls 类是在没创建实例之前就存在。

self 是你通过类实例化后的实例对象。

# class MyClass(AAA):   我要继承AAA类
class MyClass: # 不继承可以直接这样写

    # 写在这里的只要引入这个包就会执行
    classVar = "classVar" # 类变量
    _classVar = "_classVar"
    __classVar = "__classVar"
    print("已初始化类变量")

    # 只有创建类的对象时才会执行
    # 实例属性优先级高于类属性
    def __init__(self):
        self.var = "var" # 成员变量
        print("已初始化实例变量")

    # 成员/实例方法:类必须初始化后才能使用
    def func(self):
        print("类变量: ", self.classVar) # 可以
        print("成员变量: ", self.var)    # 可以

    # 类方法:不初始化类也能使用
    @classmethod
    def classFunc(cls):
        print("类变量: ", cls.classVar) # 可以
        # print("成员变量: ", cls.var1) # 无法打印成员变量,报错

    # 静态方法:仅仅放在类里面而已, 不使用类的方法
    @staticmethod
    def staticFunc():
        # print("类变量: ", cls.classVar) # 报错
        print("静态方法")

    # 将方法变为属性,一般可以通过该方法获取类的私有类变量/变量
    # getPrivateClassVar不能修改
    @property
    def getPrivateClassVar(self):
        return self.__classVar

print(MyClass.classVar)    # 可直接访问
print(MyClass._classVar)   # 仅约定私有变量,但可以访问
# print(MyClass.__classVar)  # 访问报错

class1 = MyClass()
print(class1.getPrivateClassVar)
# class1.getPrivateClassVar = 5 # 试图通过property修改会报错

类的*args, **kwargs

  • *args: 把没有参数名的数据按顺序存为元组
  • **kwargs:把有参数名的数据存为字典
def func(*args, **kwargs):
    print(args, type(args))
    print(kwargs,type(kwargs))
func("a","b","c",k1="aa",k2="bb",k3="cc")

# s
# ('a', 'a', 'c') <class 'tuple'>
# {'k1': 'aa', 'k2': 'bb', 'k3': 'cc'} <class 'dict'>

类的继承

单继承

# Animal继承与object
class Animal(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def call(self):
        print(self.name,"会叫")

class Cat(Animal):
    def __init__(self,name,age,sex):
        # 根据self去找Cat的父类,然后调用父类的init
        super(Cat,self).__init__(name,age)
        self.sex = sex
    def call(self):
        print(self.name,self.age,self.sex)

if __name__ == '__main__':
    c = Cat('mew',2,'boy')
    # 先找子类的call,找不到再找父类的call
    c.call()

多继承,如何判断?

找继承的第一个类,即从class C(B,A)可以得知继承的第一个类是B

Python中类的多继承

可以参考本篇文章下载python

Python3.11下载