定义类
使用 class 关键字定义类:
class Dog:
pass
# 创建实例
my_dog = Dog()
print(type(my_dog)) # <class '__main__.Dog'>
使用 type() 动态定义类
类本身也是对象,type() 是创建类的内置函数。可以动态地创建类:
# type(类名, (父类元组,), {属性字典})
# 定义方法
def bark(self):
print(f"{self.name} says: Woof!")
# 动态创建 Dog 类
Dog = type('Dog', (), {'name': 'Buddy', 'bark': bark})
# 创建实例
my_dog = Dog()
print(my_dog.name) # Buddy
my_dog.bark() # Buddy says: Woof!
参数说明:
- 第一个参数:类名(字符串)
- 第二个参数:继承的父类元组
- 第三个参数:类属性和方法的字典
实际应用场景: 在 ORM 框架或需要根据配置动态生成类的场景中经常使用。
构造方法 __init__
__init__ 是类的构造方法,在创建对象时自动调用,用于初始化对象的属性:
class Dog:
def __init__(this, name, age):
this.name = name
this.age = age
# 创建对象时传入参数
my_dog = Dog("Buddy", 3)
print(my_dog.name) # Buddy
print(my_dog.age) # 3
注意: self 代表对象本身,必须是第一个参数,但调用时不需要传。
实例属性与类属性
实例属性
每个对象独立的属性,通过 self 定义:
class Dog:
def __init__(self, name):
self.name = name # 实例属性
dog1 = Dog("Buddy")
dog2 = Dog("Max")
print(dog1.name) # Buddy
print(dog2.name) # Max
类属性
所有对象共享的属性,在类内部直接定义:
class Dog:
species = "Canis familiaris" # 类属性
def __init__(self, name):
self.name = name
dog1 = Dog("Buddy")
dog2 = Dog("Max")
print(dog1.species) # Canis familiaris
print(dog2.species) # Canis familiaris
# 修改类属性(通过类名)
Dog.species = "Canis lupus"
print(dog1.species) # Canis lupus
访问规则: 实例属性通过 self 访问,类属性通过 类名 或 self 访问。
实例方法
定义在类中的函数,第一个参数必须是 self:
class Dog:
def __init__(self, name):
self.name = name
def bark(self):
print(f"{self.name} says: Woof!")
def introduce(self):
self.bark() # 方法内调用其他方法
print(f"My name is {self.name}")
my_dog = Dog("Buddy")
my_dog.bark() # Buddy says: Woof!
my_dog.introduce() # Buddy says: Woof! My name is Buddy
类方法与静态方法
类方法 @classmethod
第一个参数是 cls,代表类本身,可以访问或修改类属性:
class Dog:
count = 0 # 类属性:记录创建了多少只狗
def __init__(self, name):
self.name = name
Dog.count += 1
@classmethod
def get_count(cls):
return cls.count
dog1 = Dog("Buddy")
dog2 = Dog("Max")
print(Dog.get_count()) # 2
静态方法 @staticmethod
不接收 self 或 cls,与普通函数类似,只是组织在类中:
class MathUtils:
@staticmethod
def add(a, b):
return a + b
@staticmethod
def is_even(n):
return n % 2 == 0
print(MathUtils.add(3, 5)) # 8
print(MathUtils.is_even(4)) # True
对比:
| 方法类型 | 装饰器 | 第一个参数 | 访问实例属性 | 访问类属性 |
|---|---|---|---|---|
| 实例方法 | 无 | self | ✓ | ✓ |
| 类方法 | @classmethod | cls | ✗ | ✓ |
| 静态方法 | @staticmethod | 无 | ✗ | ✗ |
继承
子类继承父类的属性和方法,并可以扩展或重写:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
print("Some sound")
class Dog(Animal): # Dog 继承 Animal
def speak(self): # 重写父类方法
print(f"{self.name} says: Woof!")
class Cat(Animal):
def speak(self):
print(f"{self.name} says: Meow!")
dog = Dog("Buddy")
cat = Cat("Kitty")
dog.speak() # Buddy says: Woof!
cat.speak() # Kitty says: Meow!
方法解析顺序(MRO)
当多个父类有同名方法时,Python 按照 MRO(Method Resolution Order)顺序查找:
class A:
def hello(self):
print("Hello from A")
class B(A):
def hello(self):
print("Hello from B")
class C(A):
def hello(self):
print("Hello from C")
class D(B, C): # MRO: D -> B -> C -> A
pass
d = D()
d.hello() # Hello from B(先找到 B 的方法)
# 查看 MRO 顺序
print(D.__mro__)
# (<class 'D'>, <class 'B'>, <class 'C'>, <class 'A'>, <class 'object'>)




