标签:实例化 code ssm python ase style 实现 rgs __call__
‘‘‘
定制类:
1. 双下划线属性__attr__
2. 元类metaclass
‘‘‘ # 综述
‘‘‘
iterable/iterator:
1. __iter__(): return iterable_obj
1) 实现了该方法的对象叫iterable
2) iter(obj)会调用该方法, 生成一个迭代器iterator
2. __next__(): 指明迭代器怎么返回值
1) next(iterator)会返回一个值, 直到所有的值都返回了报错StopIteration
2) for.. in iterable/iterator 会自动调用该方法, 迭代结束后不会报错
‘‘‘ # 迭代器: __iter__(), __next__()
‘‘‘
__dict__: 是一个字典, 包含属性和值
1) ClassName.__dict__ # 保存class中的所有data和method
2) self.__dict__/obj.__dict__ # 保存该对象data
# self.var = value 实质上就是把数据存入该字典中, 即 self.__dict__ = {‘var‘:value}
‘‘‘ # 属性字典: __dict__
‘‘‘
Seq特性:
1. __getitem__(key): return self.__dict__[key] # obj[k]获取数据值执行
2. __setitem__(key,value): self.__dict__[key] = value # obj[k]=value修改数据时执行
3. __delitem__(key): self.__dict__.pop(key) # del obj[key]删除数据时执行
4. __len__(): # len(obj)获取长度时执行
‘‘‘ # Seq特性: __getitem__(), __setitem__(), __delitem__(), __len__()
‘‘‘
属性操作: obj.attr
1. __getattr__(attr): # 当obj.attr不存在时会执行, attr为字符串
用途:
1) 不通过继承, 添加新的属性
class MyOpen:
def __init__(self,filename,mode,encoding=‘utf8‘)
self.file = open(filename,mode=mode,encoding=encoding)
def __getattr__(self,item):
return getattr(self.file,item)
f = MyOpen(‘test‘,‘r‘)
f.read()
# 执行过程为:
1> f.read 不存在
2> __getattr__(read): return getattr(f.file,‘read‘)
3> f.read() --> getattr(f.file,‘read‘)()
2. __getattribute__(attr):
1) obj.attr时总会执行
2) 当raise AttributeError时, 执行__getattr__(attr)
3. __setattr__(key,value): self.__dict__[key] = value # 当obj.key = value时执行
4. __delattr__(key): sefl.__dict__.pop(key) # 当del obj.key时执行
‘‘‘ # 属性操作: __getattr__(),__getattribute__(), __setattr__(), __delattr__()
‘‘‘
Callable方法: obj()对象可直接调用的方法
__call__():
1. obj() # 对象调用时执行
2. obj = Class() # 生成实例时, Class()会执行abc.__call__()方法, 进而调用__init__()生成实例返回对象
‘‘‘ # Callable方法: __call__()
‘‘‘
对象的字符串显示:
1. __str__() # str(obj)或者print(obj)时执行
2. __repr__() # repr(obj)或者解释器执行
3. __format__() # format(obj)执行
实例:
class TimeType():
Format_dic = {
‘ymd1‘:‘{0.year}:{0.month}:{0.days}‘,
‘ymd2‘:‘{0.year}-{0.month}-{0.days}‘
}
def __init__(self,year,month,days):
self.year = year
self.month = month
self.days = days
def __format__(self, format_spec):
fmt = TimeType.Format_dic[format_spec]
return fmt.format(self)
time = TimeType(2019,3,20)
print(format(time,‘ymd2‘))
‘‘‘ # 对象的字符串显示: __str__(), __repr__(), __format__()
‘‘‘
__slots__:
1. 类属性, 即所有实例公有的属性
2. __slots__ = (‘attr‘, ) 限定obj.attr只能为__slots__中的值
3. obj.__dict__不存在, 但Class.__dict__存在
* 省内存, 不用给每一个实例配__dict__, 但实例的数据还是独立的
* 适用于data