,

python中类和对象

定义类 使用 class 关键字定义类: 使用 type() 动态定义类 类本身也是对象,type() 是创建…

定义类

使用 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

不接收 selfcls,与普通函数类似,只是组织在类中:

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
类方法@classmethodcls
静态方法@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'>)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

About the Author

每个人都有自己得时区,在自己得时区里,一切都是准时的。

BlockSpare — News, Magazine and Blog Addons for (Gutenberg) Block Editor