Python下的Magic特殊方法

        Python提供了一些特殊方法, 掌握他们可以完成许多酷炫功能的实现, 这些特殊方法的命名一般以__开头, 并以__结尾. 这些方法由Python解释器自动调用.

1. __slots__, dir()与__dict__

        如果我们要限制一个类中的可以添加的属性, 可以定义一个特殊的变量__slots__, 简单的示例如下:

class Company(object):
    __slots__ = ('area', 'member')

huawei = Company()
huawei.area = 'chengdu'
print "huawei.area =", huawei.area

huawei.Found_time = '2008'
print "huawei.Found_time =", huawei.Found_time

# huawei.area = chengdu
# AttributeError: 'Company' object has no attribute 'Found_time'
        而查看类属性的方法有两种: dir()内建函数与__dict__, 其中dir()返回对象属性的一个名称列表, 使用继承关系返回反馈一个对象完整的有效属性. 而__dict__返回的是一个字典. 它的键是属性名, 键值是相应的属性的数据值. __dict__返回的仅仅是那个实例的局部属性集合字典, 与类关系没有那么紧密, 独立于其他实例与属性. 并且很多对象并没有__dict__, 比如list.

class Company(object):
    area = 'Finance'

    def __init__(self, member=12, Found_time='2008'):
        self.member = member
        self.Found_time = Found_time

huawei = Company()
huawei.location = 'gaoxinxiqu'
huawei = Company()
print "huawei.__dict__ =", huawei.__dict__
print "huawei.__dict__ =", huawei.__dict__
print dir(huawei)

# huawei.__dict__ = {'member': 12, 'Found_time': '2008', 'location': 'gaoxinxiqu'}
# huawei.__dict__ = {'member': 12, 'Found_time': '2008'} 
# ['Found_time', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'area', 'location', 'member']
        这里需要明确一点, area是类属性, 而member和Found_time是实例属性(通过__init__构造设置的属性), 内建函数 dir() 可以显示类属性,同样还可以打印所有实例属性, __dict__只是显示实例属性字典.




### 使用Python中的Magic方法 Magic方法提供了让对象行为类似于内置类型的简单方式[^1]。通过实现特定的魔法方法,可以定义类的行为,使其能够响应特殊操作符或函数调用。 #### 基本运算符重载 对于基本算术和比较操作符的支持可以通过覆盖相应的魔术方法来完成: | 操作 | Magic Method | | --- | --------------- | | `+` | `__add__(self, other)` | | `-` | `__sub__(self, other)` | | `<` | `__lt__(self, other)` | 例如,为了使自定义类支持加法操作,可如下定义: ```python class Point: def __init__(self, x=0, y=0): self.x = x self.y = y def __add__(self, other): return Point(self.x + other.x, self.y + other.y) p1 = Point(1, 2) p2 = Point(3, 4) result = p1 + p2 # Calls p1.__add__(p2) print(f"Result point at ({result.x}, {result.y})") ``` #### 字符串表示形式 为了让实例拥有更友好的字符串表达,通常会覆写`__str__()` 和 `__repr__()` 方法: ```python def __str__(self): """Return readable string representation.""" return f'Point({self.x},{self.y})' def __repr__(self): """Return detailed string representation used in debugging.""" return 'Point(x=%s,y=%s)' % (self.x, self.y) ``` #### 容器协议 如果希望创建的对象像列表一样工作,则需实现一系列容器相关的magic方法,比如`__len__()`, `__getitem__()`, `__setitem__()`等。 ```python class CustomList(list): def __getitem__(self, index): print("Accessing element:", index) return super().__getitem__(index) cl = CustomList([1, 2, 3]) element = cl[1] # Prints "Accessing element: 1" ``` 这些例子展示了如何利用Pythonmagic方法简化编程并提高代码的一致性和直观性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值