0
点赞
收藏
分享

微信扫一扫

python学习高级篇(part8)--类对象的特殊方法

学习笔记,仅供参考,有错必纠


文章目录

  • ​​python 学习高级篇​​
  • ​​类对象的特殊方法之`__iter__()`和`__next__()`​​
  • ​​类对象的特殊方法之`__add__()`和`__radd__()`​​


python 学习高级篇

# 支持多行输出
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = 'all' #默认为'last'



类对象的特殊方法之​​__iter__()​​​和​​__next__()​

L = [1, 2, 3, 4, 5]

for item in L:
print(item)
1
2
3
4
5

for-in语句在默认情况下不能用于自定义类对象的实例对象

class MyClass(object):
pass

for item in MyClass(): # TypeError: 'MyClass' object is not iterable
print(item)
---------------------------------------------------------------------------

TypeError Traceback (most recent call last)

<ipython-input-2-4128e49c4e9a> in <module>()
2 pass
3
----> 4 for item in MyClass(): # TypeError: 'MyClass' object is not iterable
5 print(item)


TypeError: 'MyClass' object is not iterable

python学习高级篇(part8)--类对象的特殊方法_自定义

class MyClass(object):
def __init__(self):
self.data = 0

def __iter__(self):
return self

def __next__(self):
if self.data > 5:
raise StopIteration()
else:
self.data += 1
return self.data

for item in MyClass():
print(item)
1
2
3
4
5
6



类对象的特殊方法之​​__add__()​​​和​​__radd__()​

标准算术运算符在默认情况下不能用于自定义类对象的实例对象

class MyClass1(object):
pass

class MyClass2(object):
pass

print(MyClass1() + MyClass2())
---------------------------------------------------------------------------

TypeError Traceback (most recent call last)

<ipython-input-5-eff96f1ce3ef> in <module>()
5 pass
6
----> 7 print(MyClass1() + MyClass2())


TypeError: unsupported operand type(s) for +: 'MyClass1' and 'MyClass2'

如果想让标准算术运算符可以用于自定义类对象的实例对象,必须在自定义类对象中实现标准算术运算符对应的以下特殊方法:

python学习高级篇(part8)--类对象的特殊方法_类对象_02



之所以可以使用加法和乘法运算符操作列表,是因为列表所对应的类对象​​list​​​中实现了​​+​​​和​​*​​对应的特殊方法;

之所以可以使用加法和乘法运算符操作字符串,是因为字符串所对应的类对象​​str​​​中实现了​​+​​​和​​*​​对应的特殊方法。



python学习高级篇(part8)--类对象的特殊方法_类对象_03

# 测试1
class C1(object):
def __add__(self, other):
print("特殊方法__add__被调用")
return "xxx"
# return NotImplemented

class C2(object):
def __radd__(self, other):
print("特殊方法__radd__被调用")
return "yyy"
# return NotImplemented

obj1 = C1()
obj2 = C2()

print(obj1 + obj2)
特殊方法__add__被调用
xxx
# 测试2
class C1(object):
pass

class C2(object):
def __radd__(self, other):
print("特殊方法__radd__被调用")
return "yyy"
# return NotImplemented

obj1 = C1()
obj2 = C2()

print(obj1 + obj2)
特殊方法__radd__被调用
yyy
# 测试3
class C1(object):
def __add__(self, other):
print("特殊方法__add__被调用")
return NotImplemented

class C2(object):
def __radd__(self, other):
print("特殊方法__radd__被调用")
return "yyy"
# return NotImplemented

obj1 = C1()
obj2 = C2()

print(obj1 + obj2)
特殊方法__add__被调用
特殊方法__radd__被调用
yyy

举报

相关推荐

0 条评论