Python中的类相关知识:对象、属性和方法

80 阅读3分钟

类对象

当存在了一个类定义后,类对象就被创建了。类对象支持两种操作:

  1. 属性引用:可以通过点运算符访问类对象中的属性,包括数据属性和方法。可以引用创建类对象是类名称空间中的所有名称
  2. 实例化:可以通过在类对象后加括号的方式创建类的一个新实例,实例是一个空对象,也可以有自己的属性和方法。

数据属性

数据属性是存储在类或实例对象中的变量,它们不需要声明,只要第一次赋值/分配就会出现。

方法

方法是属于一个类或实例对象的函数,它们可以访问或修改对象的状态。方法有三种类型:

  • 实例方法:第一个参数是实例本身,通常命名为 self。实例方法可以访问或修改实例属性和类属性。
  • 类方法:第一个参数是类本身,通常命名为 cls。类方法可以访问或修改类属性,但不能访问或修改实例属性。
  • 静态方法:没有特殊的第一个参数,它们就是普通的函数,只是定义在类中。静态方法不能访问或修改类属性和实例属性。

方法对象可以存储起来以后再调用。

类属性

类属性是定义在类中且在所有实例之间共享的变量,它们可以通过类名或实例名来访问或修改。例如:

class Person:
    count = 0 # 类属性,记录创建了多少个实例

    def __init__(self, name, age):
        self.name = name # 实例属性,记录姓名
        self.age = age # 实例属性,记录年龄
        Person.count += 1 # 修改类属性

p1 = Person("Alice", 20) # 创建一个实例
p2 = Person("Bob", 25) # 创建另一个实例
print(Person.count) # 输出 2
print(p1.count) # 输出 2
Person.count = 3 # 修改类属性
print(p2.count) # 输出 3

类方法

类方法是使用 @classmethod 装饰器定义的方法,它们的第一个参数是类本身。类方法最常见的用途是定义备选构造方法,也就是提供不同的方式来创建实例。例如:

class Person: 
    def **init**(self, name, age): 
        self.name = name self.age = age
        
    @classmethod
    def from_birth_year(cls, name, birth_year):
        # 这是一个备选构造方法,根据出生年份计算年龄
        age = datetime.date.today().year - birth_year
        return cls(name, age)

    @classmethod
    def from_fathers_age(cls, name, father_age, father_person_age_diff):
        # 这是另一个备选构造方法,根据父亲的年龄和父子年龄差计算年龄
        age = father_age - father_person_age_diff
        return cls(name, age)
        
p1 = Person(“John”, 25) # 使用 **init** 方法创建实例 
p2 = Person.from_birth_year(“John”, 1996) # 使用备选构造方法创建实例 
p3 = Person.from_fathers_age(“John”, 65, 40) # 使用另一个备选构造方法创建实例

静态方法

静态方法是使用 @staticmethod 装饰器定义的方法,它们没有特殊的第一个参数。静态方法就是普通的函数,只是定义在类中,而不是在模块层定义。静态方法一般用来实现一些与类或实例无关的功能,例如:

class Math:
    @staticmethod
    def add(x, y):
        # 这是一个静态方法,用来计算两个数的和
        return x + y

    @staticmethod
    def sub(x, y):
        # 这是另一个静态方法,用来计算两个数的差
        return x - y

print(Math.add(3, 4)) # 输出 7
print(Math.sub(5, 2)) # 输出 3