python 类成员


在上篇文章中,我们大致的了解了类和对象,本篇文章将详细的介绍一下类的成员组成。

1.类的成员组成

在Python中,类成员主要分为两大类:实例成员和类成员。实例成员属于类的实例(即对象),每个对象都有自己独立的实例成员。而类成员则属于类本身,由所有对象共享。

实例成员:包括实例变量(属性)和实例方法。实例变量存储对象的特定数据,实例方法则定义对象的行为。

类成员:包括类变量(类属性)和类方法、静态方法。类变量为类及其所有实例提供共享数据,类方法和静态方法则不依赖于实例状态,可直接通过类调用。

2.实例成员

2.1实例变量(属性)

实例变量是在对象创建时初始化的,用于存储对象的特定数据。它们通过对象的引用来访问。

class Dog:
    def __init__(self, name, age):
        self.name = name  # 实例变量
        self.age = age    # 实例变量

d = Dog("Buddy", 3)
print(d.name)  # 输出: Buddy

2.2实例方法

实例方法是定义在类中的函数,它们至少有一个名为self的参数,用于引用调用该方法的对象。

class Dog:
    def bark(self):
        print(f"{self.name} is barking!")

d = Dog("Buddy", 3)
d.bark()  # 输出: Buddy is barking!

3.类成员

3.1类变量(类属性)

类变量是在类级别定义的变量,它们被类的所有实例共享。通过类名或实例名都可以访问类变量,但修改时需注意,通过实例修改会创建该实例的同名实例变量,从而隐藏类变量。

class Dog:
    species = "Canis lupus familiaris"  # 类变量

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

d1 = Dog("Buddy", 3)
d2 = Dog("Charlie", 5)
print(d1.species)  # 输出: Canis lupus familiaris
print(Dog.species) # 输出: Canis lupus familiaris

# 通过实例修改会隐藏类变量
d1.species = "Mutt"
print(d1.species)  # 输出: Mutt
print(d2.species)  # 输出: Canis lupus familiaris
print(Dog.species) # 输出: Canis lupus familiaris

3.2类方法

类方法是通过类调用的方法,它们使用@classmethod装饰器,并且第一个参数是cls,代表类本身。类方法通常用于实现与类相关但不依赖于实例状态的功能。

class Dog:
    species = "Canis lupus familiaris"

    @classmethod
    def get_species(cls):
        return cls.species

d = Dog("Buddy", 3)
print(d.get_species())  # 输出: Canis lupus familiaris
print(Dog.get_species())# 输出: Canis lupus familiaris

3.3静态方法

静态方法与类没有直接关联,它们既不依赖于实例状态,也不依赖于类状态。静态方法使用@staticmethod装饰器,并且它们的参数列表与普通函数相同。

class Dog:
    @staticmethod
    def describe():
        return "Dogs are domesticated animals."

d = Dog("Buddy", 3)
print(d.describe())  # 输出: Dogs are domesticated animals.
print(Dog.describe())# 输出: Dogs are domesticated animals.

4.其他

4.1魔术方法

魔术方法,也被称为特殊方法或双下划线方法,是那些以双下划线(__)开头和结尾的方法。这些方法为类的定义提供了一种机制,使其能够响应特定的操作或事件,从而以类似于Python内置类型的方式工作。

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)

    def __repr__(self):
        return f"Vector({self.x}, {self.y})"

v1 = Vector(2, 3)
v2 = Vector(4, 5)
v3 = v1 + v2  # 调用 __add__ 方法
print(v3)     # 输出: Vector(6, 8)

在这个例子中,我们定义了一个Vector类,它有两个属性x和y。通过实现__add__方法,我们使Vector对象支持加法操作。我们还实现了__repr__方法来提供对象的字符串表示。

4.2 get和set方法

get和set方法是指与Python的property函数结合使用的装饰器方法,Python的property函数允许将类的方法转换为同名属性的getter和setter。这样,就可以通过属性访问来调用这些方法,而不是直接调用它们。

class MyClass:
    def __init__(self, value):
        self._value = value  # 私有属性(使用单下划线作为约定,不是真正的私有)

    @property
    def value(self):
        # 这是一个getter方法,但看起来像一个属性访问
        return self._value

    @value.setter
    def value(self, new_value):
        # 这是一个setter方法,用于设置属性值
        if new_value < 0:
            raise ValueError("Value cannot be negative")
        self._value = new_value

# 使用
obj = MyClass(10)
print(obj.value)  # 调用getter方法,输出: 10
obj.value = -5    # 尝试调用setter方法,将引发ValueError
obj.value = 15    # 成功设置新值
print(obj.value)  # 输出: 15

在这个例子中,value既是一个getter方法(通过@property装饰),也是一个setter方法(通过@value.setter装饰)。这些方法允许你控制对私有属性_value的访问和修改。

5.总结

Python类成员,包括实例变量、实例方法、类变量、类方法和静态方法,魔术方法,get和set方法。实例成员为对象提供了特定的数据和行为,而类成员则为类及其所有实例提供了共享的数据和功能。深入理解这些成员,有助于我们编写更加模块化、可重用和可维护的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值