class Foo():
def __init__(self, f1, f2):
"""
在类中__new__()方法返回一个对象后执行,为对象封装变量。
:param f1:
:param f2:
"""
self.f1 = f1
self.f2 = f2
print('foo类init', self)
def __new__(cls, *args, **kwargs):
"""
创建一个空对象,在执行 类名()的时候调用. 必须有返回值,返回一个空对象.python中所有的对象都是object创建的
:param args:
:param kwargs:
:return:
"""
obj1 = object.__new__(cls)
print(obj1)
return obj1
def __call__(self, *args, **kwargs):
print('foo类__call__()')
def __getitem__(self, item):
print('Foo类getitem', item)
return 1
def __setitem__(self, key, value):
self.key = key
self.value = value
print('foo类__setitem__()方法', key, value)
def __add__(self, other):
ret = self.f2 + other.f1
print('foo类__add__()方法')
return ret
def __delitem__(self, key):
print('Foo类__delitem__()方法', key)
def __enter__(self):
print("Foo类__enter__()方法")
return '__enter__()方法返回值'
def __exit__(self, exc_type, exc_val, exc_tb):
print('Foo类__exit__()方法')
# 1. 类名() 自动执行__new__() , 返回一个对象后自动执行__init__()
obj = Foo(1, 2)
obj2 = Foo(98, 99)
# 2. 对象() 自动执行__call__()
obj()
# 3 对象['k'] 自动执行 __getitem__() 可以定义返回值
a = obj['123']
print(a)
# 4. 对象['k'] = v 自动执行__setitem__() 无法返回值
# ret = obj['key'] = 'ssss' 只是相当于ret 跟 obj['key'] 被赋值'ssss'
obj['key'] = 'ssss'
# 5. 对象 + 对象 自动执行 __add__() ,将obj传递给self,将obj2传递给other,反之亦然。可以有返回值
s = obj + obj2
print(s)
# 6. del 对象['xx'] 自动执行 无法返回值 会传递给方法的参数key
del obj2['k']
# 7. with 对象 as f: 会自动执行__enter__()代码块 然后执行with下的代码块,出去的时候会自动执行__exit__()方法。__enter__()方法的返回值传递给as后的变量
with obj as f:
print('with内部代码块', f)
#运行结果:
Foo类__new__()方法 <__main__.Foo object at 0x00000267B3F6CEF0>
foo类__init_()方法 <__main__.Foo object at 0x00000267B3F6CEF0>
Foo类__new__()方法 <__main__.Foo object at 0x00000267B3FEB278>
foo类__init_()方法 <__main__.Foo object at 0x00000267B3FEB278>
foo类__call__()方法
Foo类__getitem__()方法 123
1
foo类__setitem__()方法 key ssss
foo类__add__()方法
100
Foo类__delitem__()方法 k
Foo类__enter__()方法
with内部代码块 __enter__()方法返回值
Foo类__exit__()方法
补充:直接打印类名__str__,类的描述__doc__,对象封装的变量__dict__,是否可迭代__iter__
class Foo:
"""
这是个Foo类
"""
def __init__(self, v1, v2):
self.v1 = v1
self.v2 = v2
def __str__(self):
"""
:return: 必须return一个字符串对象
"""
return "类Foo的对象"
# def __iter__(self):
# return iter([11, 22, 33, 44, 55])
def __iter__(self):
yield 11
yield 22
yield 33
yield 44
yield 55
obj = Foo(12, 34)
# 默认打印对象名,是打印对象的内存地址,但是可以通过在对象中定义__str__()方法,改变打印内容
print(obj, type(obj))
# 打印类的描述
print(obj.__doc__)
# 以字典的形式打印类中封装的变量及其值
print(obj.__dict__)
"""
如果想要把不可迭代对象--->可迭代对象
1. 在类中定义__iter__()方法
2. iter内部返回一个迭代器(生成器也是一种迭代器,所以可以在__iter__()方法中使用yield)
"""
for i in obj:
print(i)
运行结果:
类Foo的对象 <class '__main__.Foo'>
这是个Foo类
{'v1': 12, 'v2': 34}
11
22
33
44
55