"""
class Foo(object):

def __init__(self,a1,a2):
self.a1 = a1
self.a2 = a2

def __call__(self, *args, **kwargs):
print(11111,args,kwargs)
return 123

def __getitem__(self, item):
print(item)
return 8

def __setitem__(self, key, value):
print(key,value,111111111)

def __delitem__(self, key):
print(key)

def __add__(self, other):
return self.a1 + other.a2

def __enter__(self):
print('1111')
return 999

def __exit__(self, exc_type, exc_val, exc_tb):
print('22222')
"""
# 1. 类名() 自动执行 __init__
# obj = Foo(1,2)

# 2. 对象() 自动执行 __call__
# ret = obj(6,4,2,k1=456)

# 3. 对象['xx'] 自动执行 __getitem__
# ret = obj['yu']
# print(ret)

# 4. 对象['xx'] = 11 自动执行 __setitem__
# obj['k1'] = 123

# 5. del 对象[xx] 自动执行 __delitem__
# del obj['uuu']

# 6. 对象+对象 自动执行 __add__
# obj1 = Foo(1,2)
# obj2 = Foo(88,99)
# ret = obj2 + obj1
# print(ret)

# 7. with 对象 自动执行 __enter__ / __exit__
# obj = Foo(1,2)
# with obj as f: #先执行__enter__方法,再执行with里面代码代码的代码,再执行__exit__方法
# print(f)
# print('内部代码')

# 8. 真正的构造方法
# class Foo(object):
# def __init__(self, a1, a2): # 初始化方法
# """
# 为空对象进行数据初始化
# :param a1:
# :param a2:
# """
# self.a1 = a1
# self.a2 = a2
#
# def __new__(cls, *args, **kwargs): # 构造方法
# """
# 创建一个空对象
# :param args:
# :param kwargs:
# :return:
# """
# return object.__new__(cls) # Python内部创建一个当前类的对象(初创时内部是空的.).
#
# obj1 = Foo(1,2)
# print(obj1)
#
# obj2 = Foo(11,12)
# print(obj2)
# __str__
class Foo(object):
def __init__(self):
pass

def func(self):
pass

def __str__(self):
return "F1"

obj = Foo()
print(obj,type(obj)) #直接打印obj对象会调用__str__方法

#__doc__

class Foo(object):
"""
asdfasdfasdfasdf
"""
def __init__(self):
pass

def func(self):
pass

def __str__(self):
return "F1"

obj = Foo()
print(obj.__doc__) #打印出注释的内容 asdfasdfasdfasdf

__dict__

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

def func(self):
pass

obj1 = Foo('刘博文',99)
obj2 = Foo('史雷',89)

#打印出对象封装的值
print(obj1.__dict__) # {'name': '刘博文', 'age': 99}
print(obj2.__dict__) # {'name': '史雷', 'age': 89}

__iter__
# l1是list类的一个对象,可迭代对象
l1 = [11,22,33,44]

# l2是list类的一个对象,可迭代对象
l2 = [1,22,3,44]

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

def func(self):
pass

def __iter__(self):
# return iter([11,22,33,44,55,66])

yield 11
yield 22
yield 33

# obj1是Foo类的一个对象,可迭代对象
"""
如果想要把不可迭代对象 -> 可迭代对象
1. 在类中定义__iter__方法
2. iter内部返回一个迭代器(生成器也是一种特殊迭代器)
"""
obj1 = Foo('刘博文',99)

for item in obj1:
print(item)