面向对象3
instance 和 issubclass
instance
- 判断是否是同一个类
class Foo:
pass
foo=Foo()
print(isinstance(foo,Foo))
print(isinstance(1,int))
True
True
issubclass
- a是否继承于b这个类
class Foo:
pass
foo=Foo()
print(isinstance(foo,Foo))
print(isinstance(1,int))
class Bar(Foo):
pass
print(issubclass(Bar,Foo))
True
True
True
反射
所谓反射,是指程序可以访问,检测和修改它本身状态或者行为的能力,就是它自己看看它自己是个啥情况(自省)
Python中,面向对象中的反射是指通过字符串的形式操作对象的相关属性。
四个可以实现自省的函数
- hasattr
- getattr
- setattr
- delattr
class Foo:
f='类的静态变量'
def __init__(self,name,age):
self.name=name
self.age=age
def say(self):
print('Hello',self.name)
obj=Foo('Tom',22)
#检测是否含有某个属性
print(hasattr(obj,'name'))
print(hasattr(obj,'say'))
#删除属性
delattr(obj,'show_name')
print(obj.__dict__)
delattr(obj,'Hello')
True
True
##‘del’
构造方法,当对象在内存中被释放,就会自动触发执行
一般不需要自定义
因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。
’str‘
- 如果直接print打印对象,会看到创建对象的内存地址
- 当我们使用print(XXX)时,输出对象,如果对象中定义了’str’方法,就会打印该方法return的信息描述。
类装饰器
def func():
print('Hello')
func()
print(func())
#调用----->call ---called
对应的,类实例对象的调用,需要使用到"__call__特殊方法"
class Student:
def __init__(self,name):
self.name=name
def __call__(self, classmate):
print('我的名字是:%s,我的同桌是%s'%(self.name,classmate))
stu=Student('嗷嗷嗷')
stu('呜呜呜')
我的名字是:嗷嗷嗷,我的同桌是呜呜呜
[外链图片转存失败(img-iLudLDWy-1564738210846)(C:\Users\xdw\AppData\Roaming\Typora\typora-user-images\1564714627422.png)]
smate))
stu=Student(‘嗷嗷嗷’)
stu(‘呜呜呜’)
我的名字是:嗷嗷嗷,我的同桌是呜呜呜
[外链图片转存中...(img-iLudLDWy-1564738210846)]