Python面向对象特殊成员详解:__call__、__getitem__、__dict__与__iter__
本文深入解析Python类中的特殊成员方法,涵盖__call__实现对象可调用的机制,__getitem__、__setitem__和__delitem__支持字典式访问及切片处理,__dict__用于获取类与对象成员字典,以及__iter__配合yield实现可迭代对象。通过具体代码示例,展示这些魔术方法在Python编程中的实际应用与行为逻辑。
在Python面向对象编程中,类包含一系列以双下划线开头和结尾的特殊成员方法(魔术方法),它们定义了类的特定行为。其中,__call__方法允许实例像函数一样被调用,从而增强对象的灵活性。
#!/usr/bin/env python
# _*_coding:utf-8 _*_
class SpecialMembers:
# 类的构造方法
def __init__(self):
print("My Blog is Url: http://yw666.blog.51cto.com")
# 对象的构造方法
def __call__(self):
print("My Name is: Yangwen")
# 创建一个对象,并且执行类的构造方法
obj = SpecialMembers()
# 执行对象的构造方法
obj()
# 先执行类的构造方法,然后在执行对象的构造方法
SpecialMembers()()
运行上述代码后,终端输出显示:首先执行类的构造逻辑,打印博客地址;随后执行对象调用逻辑,打印姓名。若直接对类进行实例化并立即调用(如SpecialMembers()()),则会依次执行构造与调用逻辑,分别打印博客地址和姓名。
yangwen@Darker:~$ python3 /home/yangwen/文档/Python_code/sublime/Week06/Day04/s2.py My Blog is Url: http://yw666.blog.51cto.com My Name is: Yangwen My Blog is Url: http://yw666.blog.51cto.com My Name is: Yangwen
除了__call__,Python还支持通过__getitem__、__setitem__和__delitem__方法实现类似字典的访问、赋值和删除操作。当对对象执行obj['key']、obj['key'] = value或del obj['key']时,分别自动触发对应的方法。
#!/usr/bin/env python
# _*_coding:utf-8 _*_
class SpecialMembers:
# 当执行obj['value']的时候就会自动执行__getitem__方法,并且把对象括号内的值当做__getitem__的值
def __getitem__(self, item):
print(item)
def __setitem__(self, key, value):
print(key, value)
def __delitem__(self, key):
print(key)
# 创建一个对象
obj = SpecialMembers()
# 自动执行__getitem__方法
obj['value']
# 自动执行__setitem__方法
obj['k1'] = "values"
# 自动执行__delitem__方法
del obj['key']
执行示例代码后,终端依次输出:访问时打印键名'value';赋值时打印键'k1'和值'values';删除时打印键名'key'。这展示了自定义对象如何模拟字典行为。
ansheng@Darker:~$ python3 /home/yangwen/文档/Python_code/sublime/Week06/Day04/s2.py value k1 values key
值得注意的是,当使用切片语法(如obj[1:3])访问、赋值或删除对象成员时,Python会将切片转换为slice对象传递给相应方法。在Python 3中,__getslice__等方法已废弃,统一由__getitem__、__setitem__和__delitem__处理slice类型参数。
#!/usr/bin/env python
# _*_coding:utf-8 _*_
class SpecialMembers:
# 当执行obj['value']的时候就会自动执行__getitem__方法,并且把对象括号内的值当做__getitem__的值
def __getitem__(self, item):
print(item, type(item), "__getitem__")
def __setitem__(self, key, value):
print(key, value)
def __delitem__(self, key):
print(key)
# 创建一个对象
obj = SpecialMembers()
# 自动执行__getitem__方法
obj[1:3] # __getslice__/__getitem__
# 自动执行__setitem__方法
obj[1:3] = [11, 22, 33] # __setslice__/__setitem__
# 自动执行__delitem__
del obj[1:3] # __delslice__/__delitem__
运行切片示例代码后,终端输出显示:访问、赋值和删除操作均接收slice(1, 3, None)对象,并打印相应的键、值或键名。这表明切片操作被正确封装为slice实例,由对应的魔术方法处理。
yangwen@Darker:~$ python3 /home/yangwen/文档/Python_code/sublime/Week06/Day04/s2.py slice(1, 3, None) <class 'slice'> __getitem__ slice(1, 3, None) [11, 22, 33] slice(1, 3, None)
__dict__是另一个重要的特殊成员,它返回一个字典,包含类或实例的所有属性。通过访问SpecialMembers.__dict__可以获取类的成员字典,而obj.__dict__则获取实例的属性字典。
上述代码展示了如何获取类及其实例的成员信息。SpecialMembers.__dict__包含类的内部属性如__module__、__doc__、__init__等;而实例obj.__dict__则包含实例化时设置的属性,如Name和Blog。
#!/usr/bin/env python
# _*_coding:utf-8 _*_
class SpecialMembers:
"""
类的注释
"""
def __init__(self):
self.Name = "Ansheng"
self.Blog = "http://yw666.blog.51cto.com"
# 获取类中的成员
print(SpecialMembers.__dict__)
# 创建一个对象
obj = SpecialMembers()
# 获取对象中的成员
print(obj.__dict__)
执行获取成员代码后,终端输出:类的__dict__包含__weakref__、__doc__、__module__、__dict__和__init__等键值对;实例的__dict__包含'Blog'和'Name'两个属性及其值。这清晰区分了类级别与实例级别的成员存储。
yangwen@Darker:~$ python3 /home/yangwen/文档/Python_code/sublime/Week06/Day04/s2.py
{'__weakref__': <attribute '__weakref__' of 'SpecialMembers' objects>, '__doc__': '\n 类的注释\n ', '__module__': '__main__', '__dict__': <attribute '__dict__' of 'SpecialMembers' objects>, '__init__': <function SpecialMembers.__init__ at 0x7ff2af2d7598>}
{'Blog': 'http://yw666.blog.51cto.com', 'Name': 'Yangwen'}
__iter__方法用于定义对象的迭代行为。若一个类定义了__iter__方法,其实例即可被for循环遍历。该方法通常返回一个迭代器,或者直接使用yield生成值,使对象成为生成器。
当对象包含__iter__方法且该方法中使用yield返回多个值时,该对象即为可迭代对象。在for循环中遍历该对象时,__iter__方法会被自动调用,并依次产生yield指定的值。
#!/usr/bin/env python
# _*_coding:utf-8 _*_
class SpecialMembers:
def __iter__(self):
yield 1
yield 2
yield 3
# 创建一个对象
obj = SpecialMembers()
# 如果执行for循环对象时,自动会执行对象的__iter__方法,此时的__iter__就是一个生成器
for i in obj:
print(i)
运行迭代示例代码后,终端依次输出:1、2、3。这表明for循环自动调用__iter__方法,并通过yield机制逐个生成并打印值,实现了自定义对象的迭代功能。
yangwen@Darker:~$ python3 /home/yangwen/文档/Python_code/sublime/Week06/Day04/s2.py 1 2 3
以上介绍了Python面向对象中__call__、__getitem__系列、__dict__和__iter__等特殊成员方法的核心用法与行为机制。这些魔术方法为Python类提供了强大的扩展能力,使对象能够模拟函数、字典、容器和迭代器等常见数据结构的行为。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









