1、__str__和__repr__
__init__ 常用方法, 用于初始化一个类
__str__ 输出字符串,用户看
__repr__ 输出字符串,程序员调试看
实例对比
A. __init__
#conding = utf-8
class Student(object):
def __init__(self,name):
self.name = name
print(Student('xiaoming'))
>>> <__main__.Student object at 0x0000000002EE7160>
B. __str__
将上述例子由__init__换成__str__
#conding = utf-8
class Student(object):
def __init__(self,name):
self.name = name
def __str__(self):
return "学生名称: %s" % self.name
print(Student('xiaoming'))
>>>学生名称: xiaoming
C. __repr__
交互模式下,调用__str__可能会调用到__repr__,从而返还字符串
此时要在__str__方法后面加上__repr__= __str__
2、__iter__ 迭代器,循环语句可以使用
class test():
def __init__(self,data=1):
self.data = data
def __iter__(self):
return self
def __next__(self):
if self.data > 5:
raise StopIteration #停止迭代
else:
self.data+=1
return self.data
for item in test(3):
print(item)
>>>4 5 6
这个语句其实做了两件事。第一件事是获得一个可迭代器,即调用了__iter__()函数。
第二件事是循环的过程,循环调用__next__()函数。
class test():
def __init__(self,data=1):
self.data = data
def __next__(self):
if self.data > 5:
raise StopIteration
else:
self.data+=1
return self.data
t = test(3)
for i in range(3):
print(t.__next__())
>>>4 5 6
含有__next__()函数的对象都是一个迭代器,所以test也可以说是一个迭代器。如果去掉__itet__()函数,test这个类也不会报错。
3、__getitem__ 实例对象(假设为P)可以P[key]取值。
class test():
def __init__(self,ID,address):
self.ID = ID
self.address = address
def __getitem__(self,key):
return 'hello'
date= test(3,'192.168.1.11')
print (date[0])
>>> hello
__getitem__ P为类的一个对象,通过P[key]取值. 例如:s['name'],自调用__getitem__
__getattr__ P为类的一个对象,通过P.key取值. 例如:s.name,自调用__getattr__
__setitem__ P为类的一个对象,通过P[key]= value取值. 例如:s['name'] = 'tom' ,自调用
__setattr__ P为类的一个对象,通过P.key= value取值. 例如s.name='tom',自调用
__dict__ 为参数字典
例子
class Student:
def __getattr__(self, item):
return item + ' is not exits'
def __setattr__(self, key, value):
self.__dict__[key] = value
def __getitem__(self, item):
return self.__dict__[item]
def __setitem__(self, key, value):
self.__dict__[key] = value
s = Student()
print(s.name) # 调用__getattr__方法,输出'name is not exits'
s.age = 1 # 调用__setattr__ 方法
print(s.age) # 输出 1
print(s['age']) # 调用 __getitem__方法 输出1
s['name'] = 'tom' # 调用 __setitem__ 方法
print(s['name']) # 调用 __getitem__ 方法 输出 'tom'
4.__call__ 可以模拟函数的行为, 用于创建仿函数或代理
class DistanceForm(object):
def __init__(self, origin):
self.origin = origin
print ('origin :'+str(origin))
def __call__(self, x):
print ('x :'+str(x))
p = DistanceForm(100)
p(200)
p(300)
>>>origin :100
>>>x :200
>>x :300