Python 进阶

面向对象

  • 以双下划线开头的属性(如 __item)被视为私有属性,但仍可以通过名称改写后的方式访问到。
  • 类属性与类本身绑定,所有实例共享;实例属性通过 self 绑定,每个实例独立。
class People:
    # 类属性:与类关联。若为不可变类型(如字符串),实例修改时不会影响其他实例;
    # 若为可变类型(如 list),则会被所有实例共享,需特别注意。
    People_name = "People"

    def __init__(self, name):
        self.name = name  # 实例属性,与实例关联

可以通过 type() 查看对象所属的类型:

print(type(People))

__init__ 构造方法

继承

子类会继承父类的属性和方法:

方法重写

几个关键点:

  • 子类对象调用方法时,优先在子类中查找。
  • 如果子类没有定义 __init__,默认会调用父类的 __init__。通常的做法是:子类定义自己的 __init__,在其中显式调用父类的 __init__,再补充子类特有的属性。
  • 多继承时,如果多个父类都定义了同名方法(如 speak),而子类没有定义,会按照 SonClass.__mro__ 给出的顺序去查找。MRO(Method Resolution Order)的规则是:优先当前类,然后按照类定义时声明的父类顺序依次查找。

多态

isinstance(obj, Class)  # 判断对象是否属于某个类型

静态方法与类方法

内置方法(魔法方法)

装饰器

装饰器本质上是一种类似 AOP(切面编程)的机制:在不修改原函数的前提下,为其增加额外的行为。

调用 fun(hi) 实际返回的是一个闭包 inner 函数,该闭包持有变量 hi 的引用:

未使用语法糖的写法:

def hi():
    print("hi")

def fun(i_fun):
    def inner():
        print("before")
        i_fun()
        print("after")
    return inner

hi = fun(hi)
hi()

使用 @ 语法糖的等价写法:

def fun(i_fun):
    def inner():
        print("before")
        i_fun()
        print("after")
    return inner

@fun
def hi():
    print("hi")

hi()

装饰带参数和返回值的函数:

异常处理

所有异常类的基类是 BaseException