继承怎么写?
子类名后面的括号里写父类,多个父类用逗号隔开就是多继承。
# 单继承:子类(父类)class Child(Parent): pass# 多继承:子类(父类1, 父类2, ...)class Child(Parent1, Parent2): pass
子类会继承哪些东西?
| |
|---|
| def method(self): ... |
| @classmethod def cm(cls): ... |
| @staticmethod def sm(): ... |
| |
| 在 __init__ 等里用 self.xxx = ... 赋值的(通过 __init__ 被调用而继承) |
不会自动“复制”的只有以双下划线开头、且不以双下划线结尾的名字(名称改写 name mangling),例如 __private 会变成 _ClassName__private,本质还是能访问,只是名字被改了。
常见用法
1、直接使用父类实现
class Animal: def speak(self): return "some sound"class Dog(Animal): passd = Dog()d.speak() # "some sound",继承自 Animal
2、重写方法(Override)
class Dog(Animal): def speak(self): return "woof"
3、 用 super() 扩展父类行为
class Dog(Animal): def __init__(self, name): super().__init__() # 先调父类的 __init__ self.name = name def speak(self): return f"{super().speak()} - woof" # 先调父类再扩展
4、多继承与方法解析顺序(MRO)多继承时,属性/方法按 MRO 查找(可用 ClassName.__mro__ 看顺序):
class A: def f(self): return "A"class B(A): def f(self): return "B"class C(A): def f(self): return "C"class D(B, C): passD().__mro__ # (D, B, C, A, object)D().f() # "B"(先找到 B.f)
Python中的类方法和静态方法是什么?
类方法 @classmethod
- 第一个参数:约定写 cls,调用时自动传入当前类(不是实例)。
- 能访问:类属性、其他类方法;不能直接拿到「当前实例」,除非通过参数传入。
- 常见用途:工厂方法(用类名创建实例)、操作类级别数据、子类继承时 cls 会变成子类。
class MyClass: count = 0 @classmethod def from_string(cls, s): """工厂方法:用字符串创建实例""" return cls(int(s)) @classmethod def get_count(cls): return cls.count# 调用obj = MyClass.from_string("42") # cls 是 MyClassMyClass.get_count() # 访问类属性
子类调用时,cls 是子类,所以 from_string 会创建子类实例:
class Sub(MyClass): passSub.from_string("1") # 得到的是 Sub 的实例,不是 MyClass 的
静态方法 @staticmethod
- 参数:没有自动传入的 self 或 cls,和普通函数一样。
- 不能直接访问:类属性、实例属性(除非通过参数传进来)。
- 常见用途:把和类逻辑相关的工具函数放在类里,组织代码;或不需要 self/cls 的辅助函数。
class MyClass: @staticmethod def is_valid(x): return isinstance(x, int) and x > 0 def use_it(self, x): if MyClass.is_valid(x): # 或 self.is_valid(x) ...
对比小结
- 类方法:需要「当前是哪个类」时用(cls),常用来造对象或算类级别的东西。
- 静态方法:不需要 self 也不需要 cls,只是挂在类名下的普通函数,便于归类。