Python 类与实例

152 阅读4分钟

一、什么是类(Class)

类是对象的蓝图,它定义了一组属性和方法。类是用来描述某一类对象的特征和行为的模板,所有通过类创建的对象都会继承这些特征和行为。可以将类想象成一个“工厂”,通过类这个“工厂”可以生成多个“产品”(即实例)。

类的定义

在Python中,我们通过class关键字定义一个类。一个类可以包含多个属性(也叫实例变量)和方法(也叫实例函数)。以下是一个简单的类的定义:

class Dog:
    # 类的属性
    species = "Canis familiaris"  # 所有实例共享的属性

    # 初始化方法(构造函数)
    def __init__(self, name, age):
        self.name = name  # 实例属性
        self.age = age    # 实例属性

    # 类的方法
    def bark(self):
        print(f"{self.name} says woof!")

    def get_age(self):
        return self.age
  • class Dog: : 声明了一个名为 Dog 的类。

  • __init__(self, name, breed, age) : 这是一个特殊的方法,称为构造函数(constructor)。当创建 Dog 类的实例时,它会被自动调用,用于初始化实例的属性。

    • self: 代表实例本身,是每个实例方法(如 __init__barkdescribe)的第一个参数。

二、什么是实例(Instance)?

实例是通过类创建的对象,表示类的一个具体化。每个实例都有自己的属性和方法,可以独立于其他实例。可以通过调用类的构造函数来创建一个实例。

创建实例

创建类的实例时,我们需要调用类的构造函数__init__,并传入必要的参数。

# 创建Dog类的实例
my_dog = Dog("Buddy", 5)

# 访问实例的属性
print(my_dog.name)  # 输出: Buddy
print(my_dog.age)   # 输出: 5

# 调用实例的方法
my_dog.bark()  # 输出: Buddy says woof!

这里,我们通过Dog("Buddy", 5)创建了一个名为my_dog的实例,表示一只名字叫做“Buddy”、5岁大的狗。通过实例,我们可以访问该狗的名字和年龄,并调用它的bark方法。

三、类与实例的关系

类和实例之间的关系可以理解为“模板”与“具体产品”的关系。类是创建实例的模板,而实例是根据这个模板创建的具体对象。

每个实例都有自己的属性值,但它们共享类中定义的方法。例如,我们可以创建另一个Dog类的实例:

my_dog2 = Dog("wangwang", 5)
my_dog2.bark()
# 输出: wangwang says woof!

尽管my_dogmy_dog2都是Dog类的实例,但它们的属性值不同,因此它们是两个不同的对象。

四、类的属性和方法

1. 属性

类的属性可以分为两类:实例属性和类属性。

  • 实例属性:每个实例都有自己独立的属性值。例如,nameage就是实例属性,因为每个Dog实例都有自己独立的nameage
  • 类属性:类属性是所有实例共享的属性。它们在类定义中直接声明,而不是在__init__方法中。例如:
python复制代码
class Dog:
    species = "Homo Sapiens"  # 类属性

    def __init__(self, name, age):
        self.name = name  # 实例属性
        self.age = age    # 实例属性

在这个例子中,species是一个类属性,所有Dog实例都共享这个属性。

2. 方法

类的方法可以分为实例方法、类方法和静态方法。

  • 实例方法:实例方法是与实例相关联的方法,它们通常用于操作实例的属性。实例方法的第一个参数通常是self,表示调用该方法的实例。例如,bark就是一个实例方法。
  • 类方法:类方法是与类相关联的方法,它们通常用于操作类属性或执行与类相关的操作。类方法使用@classmethod装饰器来定义,第一个参数通常是cls,表示调用该方法的类。例如:
class Dog:
    species = "Homo Sapiens"

    def __init__(self, name, age):
        self.name = name
        self.age = age

    @classmethod
    def get_species(cls):
        return cls.species
  • 静态方法:静态方法是不与类或实例相关联的方法,它们通常用于执行与类或实例无关的操作。静态方法使用@staticmethod装饰器来定义,不需要selfcls参数。例如:
class Dog:
    species = "Homo Sapiens"

    def __init__(self, name, age):
        self.name = name
        self.age = age

    @staticmethod
    def is_adult(age):
        return age >= 18


# 创建实例
dog1 = Dog("Buddy", 5)

print(Dog.is_adult(dog1.age))