python之类(class)魔术方法或双下划线方法

在 Python 中,类(class)是面向对象编程的核心概念。类中有一些特殊的方法(也称为魔术方法或双下划线方法),这些方法在特定情况下会被自动调用。以下是一些常见的特殊方法及其用法:

__init__ 方法

__init__ 方法是类的构造函数,用于在创建对象时初始化对象的属性。

用法:

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

# 创建对象时会自动调用 __init__ 方法
obj = MyClass("Alice", 30)
print(obj.name)  # 输出: Alice
print(obj.age)   # 输出: 30

__str__ 方法

__str__ 方法用于定义对象的字符串表示,当使用 print 函数或 str 函数时会调用这个方法。

用法:

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

    def __str__(self):
        return f"MyClass(name={self.name}, age={self.age})"

obj = MyClass("Alice", 30)
print(obj)  # 输出: MyClass(name=Alice, age=30)

__repr__ 方法

__repr__ 方法用于定义对象的官方字符串表示,通常用于调试和开发。当在解释器中直接输入对象名时会调用这个方法。

用法:

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

    def __repr__(self):
        return f"MyClass(name={self.name}, age={self.age})"

obj = MyClass("Alice", 30)
obj  # 输出: MyClass(name=Alice, age=30)

__eq__ 方法

__eq__ 方法用于定义两个对象是否相等,当使用 == 运算符时会调用这个方法。

用法:

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

    def __eq__(self, other):
        if isinstance(other, MyClass):
            return self.name == other.name and self.age == other.age
        return False

obj1 = MyClass("Alice", 30)
obj2 = MyClass("Alice", 30)
print(obj1 == obj2)  # 输出: True

__len__ 方法

__len__ 方法用于定义对象的长度,当使用 len 函数时会调用这个方法。

用法:

class MyClass:
    def __init__(self, items):
        self.items = items

    def __len__(self):
        return len(self.items)

obj = MyClass([1, 2, 3, 4])
print(len(obj))  # 输出: 4

__getitem__ 方法

__getitem__ 方法用于定义对象的索引访问,当使用 obj[key] 语法时会调用这个方法。

用法:

class MyClass:
    def __init__(self, items):
        self.items = items

    def __getitem__(self, index):
        return self.items[index]

obj = MyClass([1, 2, 3, 4])
print(obj[2])  # 输出: 3

__setitem__ 方法

__setitem__ 方法用于定义对象的索引赋值,当使用 obj[key] = value 语法时会调用这个方法。

用法:

class MyClass:
    def __init__(self, items):
        self.items = items

    def __setitem__(self, index, value):
        self.items[index] = value

obj = MyClass([1, 2, 3, 4])
obj[2] = 10
print(obj.items)  # 输出: [1, 2, 10, 4]

__delitem__ 方法

__delitem__ 方法用于定义对象的索引删除,当使用 del obj[key] 语法时会调用这个方法。

用法:

class MyClass:
    def __init__(self, items):
        self.items = items

    def __delitem__(self, index):
        del self.items[index]

obj = MyClass([1, 2, 3, 4])
del obj[2]
print(obj.items)  # 输出: [1, 2, 4]

如果一个类有多个属性,你可以在 __init__ 方法中初始化这些属性,并在其他特殊方法中根据需要使用这些属性。以下是一个示例,展示了如何处理多个属性,并在不同的特殊方法中使用它们。

示例类:Person

假设有一个 Person 类,它有多个属性:nameageaddress。下面展示如何在这个类中使用多个属性,并实现一些常见的特殊方法。

class Person:
    def __init__(self, name, age, address):
        self.name = name
        self.age = age
        self.address = address

    def __str__(self):
        return f"Person(name={self.name}, age={self.age}, address={self.address})"

    def __repr__(self):
        return f"Person(name={self.name}, age={self.age}, address={self.address})"

    def __eq__(self, other):
        if isinstance(other, Person):
            return (self.name == other.name and
                    self.age == other.age and
                    self.address == other.address)
        return False

    def __len__(self):
        # 假设我们想要返回地址的长度
        return len(self.address)

    def __getitem__(self, key):
        # 允许通过索引访问属性
        if key == 'name':
            return self.name
        elif key == 'age':
            return self.age
        elif key == 'address':
            return self.address
        else:
            raise KeyError(f"Key {key} not found")

    def __setitem__(self, key, value):
        # 允许通过索引设置属性
        if key == 'name':
            self.name = value
        elif key == 'age':
            self.age = value
        elif key == 'address':
            self.address = value
        else:
            raise KeyError(f"Key {key} not found")

    def __delitem__(self, key):
        # 允许通过索引删除属性
        if key == 'name':
            del self.name
        elif key == 'age':
            del self.age
        elif key == 'address':
            del self.address
        else:
            raise KeyError(f"Key {key} not found")

# 创建一个 Person 对象
person = Person("Alice", 30, "123 Main St")

# 使用 __str__ 方法
print(person)  # 输出: Person(name=Alice, age=30, address=123 Main St)

# 使用 __repr__ 方法
print(repr(person))  # 输出: Person(name=Alice, age=30, address=123 Main St)

# 使用 __eq__ 方法
person2 = Person("Alice", 30, "123 Main St")
print(person == person2)  # 输出: True

# 使用 __len__ 方法
print(len(person))  # 输出: 11 (因为地址 "123 Main St" 的长度是 11)

# 使用 __getitem__ 方法
print(person['name'])  # 输出: Alice
print(person['age'])   # 输出: 30
print(person['address'])  # 输出: 123 Main St

# 使用 __setitem__ 方法
person['age'] = 31
print(person.age)  # 输出: 31

# 使用 __delitem__ 方法
del person['address']
print(person)  # 输出: Person(name=Alice, age=31, address=None)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼爱吃火锅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值