Python全栈开发——面向对象进阶(一切皆对象)
Posted IT_study
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python全栈开发——面向对象进阶(一切皆对象)相关的知识,希望对你有一定的参考价值。
1.isinstance(obj,cls) 检查obj是否是类cls的对象,
issubclass(sub,super) 检查sub是否是super的子类
#isinstance(obj,cls) 检查obj是否是类cls的对象
class Foo:
pass
f=Foo()
print(isinstance(f,Foo)) #True
#issubclass(sub,super) 检查sub是否是super的子类
class Bar(Foo):
pass
print(issubclass(Bar,Foo)) #Ture
2.反射(常用于可插拔方式)
3.__setattr__,__getattr__,__delattr__
4.二次加工标准类型(包装)
5.__getattribute__
class Foo:
def __init__(self,y):
self.y=y
#有__getattribute__,则__getattr__不会触发
#实际上只有触发AttributeError时,才会触发
def __getattr__(self, item):
print(‘getattr‘)
#实例化访问时,不管存不存在属性,都会调用
def __getattribute__(self, item):
print(‘getattribute‘)
f=Foo(3)
f.c # getattribute
f.y # getattribute
6.描述符(__get__,__set__,__delete__)
7.再看property
8.__setitem__,__getitem__,__delitem__
#通过字典形式访问才会触发,和内置attr差不多
class Foo:
def __getitem__(self, item):
print(‘getitem‘)
def __setitem__(self, key, value):
print(‘setitem‘)
self.__dict__[key]=value
def __delitem__(self, key):
print(‘delitem‘)
f=Foo()
f[‘l‘]=‘k‘ #setitem
print(f.__dict__) #{‘l‘: ‘k‘}
f[‘l‘] #getitem
del f[‘ff‘] #delitem
9.__str__,__repr__,__format__
#__repr__,__str__ 控制对象的显示方式,一定有返回值,且为字符串形式
# print的原理就是输出___str__的信息,若找不到,用__repr__代替
class Foo:
def __str__(self):
return ‘str‘
def __repr__(self):
return ‘repr‘
x=Foo()
print(x) #str
#__format__
x=‘{0}-{0}-{0}‘.format(‘d‘)
print(x) #d-d-d
Date_geshi={
‘ymd‘:‘{0.year}-{0.month}-{0.day}‘,
‘ydm‘:‘{0.year}-{0.day}-{0.month}‘,
‘mdy‘:‘{0.month}-{0.day}-{0.year}‘,
}
class Date:
def __init__(self,year,month,day):
self.year=year
self.month=month
self.day=day
#定制格式
def __format__(self, format_spec=‘ymd‘):
if format_spec not in Date_geshi:
print(‘没有该格式‘)
format_spec = ‘ymd‘
print(format_spec) # ymd
return Date_geshi[format_spec].format(self)
d=Date(2016,12,23)
d1=d.__format__(‘hgfh‘)
print(d1) # 2016-12-23
print(format(d,‘mdy‘)) #相当于执行 d.__format__(‘mdy‘)
# 12-23-2016
10.__slots__(如果一个属性很少的类,但是有很多 实例,为了节省内存,可以使用__slots__取代实例的__dict__)
class Foo:
#设置之后,class没有__dict__属性了
#也限制了创建,只能定义你定义的属性
#只能定义__slots__提供的name,age
__slots__ = [‘name‘,‘age‘]
f=Foo()
f.name=13
11.__doc__(打印类文档)
12.__module__ 表示当前操作的对象在哪个模块
__class__ 表示当前操作的对像是哪个类
13.__del__析构方法
14__call__对象后面加括号,触发执行
class Foo:
def __call__(self,*args,**kwargs):
print(‘__call__‘)
f=Foo()
f() #__call__
15__next__,__iter__(迭代器协议)
class FBIF:
def __init__(self,_a,_b):
self.__a=_a
self.__b=_b
def __iter__(self):
return self
def __next__(self):
self.__a,self.__b=self.__b,self.__b+self.__a
return self.__a
f=FBIF(1,1)
print(next(f))
print(next(f))
print(‘---------------->‘)
for i in f:
print(i)
if i>100:
raise StopIteration(‘ffff‘)
以上是关于Python全栈开发——面向对象进阶(一切皆对象)的主要内容,如果未能解决你的问题,请参考以下文章