python基本知识(八):定制类,双下划线方法

'''
定制类:
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中的所有datamethod
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__, 但实例的数据还是独立的

转载于:https://www.cnblogs.com/lancelotxly/p/10837785.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值