isinstance(obj,cls)检查是否obj是否是类 cls 的对象
class Foo(object):
pass
obj = Foo()
print(isinstance(obj, Foo))
issubclass(sub, super)检查sub类是否是 super 类的派生类
class Foo(object):
pass
class Bar(Foo):
pass
print(issubclass(Bar, Foo))
>>True
python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
四个实现反射的函数:
hasattr(object,name:判断object中有没有一个name字符串对应的方法或属性
getattr(object, name, default=None):获取属性
setattr(x, ‘y‘, v) :设置属性,is equivalent to ``x.y = v‘‘
delattr(x, ‘y‘) :删除属性,is equivalent to ``del x.y‘‘
四个方法使用的演示:
class BlackMedium:
feature=‘Ugly‘
def __init__(self,name,addr):
self.name=name
self.addr=addr
def sell_house(self):
print(‘%s 黑中介卖房子啦,傻逼才买呢,但是谁能证明自己不傻逼‘ %self.name)
def rent_house(self):
print(‘%s 黑中介租房子啦,傻逼才租呢‘ %self.name)
b1=BlackMedium(‘万成置地‘,‘回龙观天露园‘)
#检测是否含有某属性
print(hasattr(b1,‘name‘))
print(hasattr(b1,‘sell_house‘))
#获取属性
n=getattr(b1,‘name‘)
print(n)
func=getattr(b1,‘rent_house‘)
func()
# getattr(b1,‘aaaaaaaa‘) #报错
print(getattr(b1,‘aaaaaaaa‘,‘不存在啊‘))
#设置属性
setattr(b1,‘sb‘,True)
setattr(b1,‘show_name‘,lambda self:self.name+‘sb‘)
print(b1.__dict__)
print(b1.show_name(b1))
#删除属性
delattr(b1,‘addr‘)
delattr(b1,‘show_name‘)
delattr(b1,‘show_name111‘)#不存在,则报错
print(b1.__dict__)
四个方法的使用演示
__str__:定义在类内部的内置的绑定方法,打印的会自动将对象传入
class Teacher:
def __init__(self,name,age):
self.name=name
self.age=age
self.courses=[]
def teach(self):
print(‘%s teach‘ %self.name)
def __str__(self):
return ‘<name:%s age:%s>‘ %(self.name,self.age)
class Course:
def __init__(self,name,price,period):
self.name=name
self.price=price
self.period=period
def __str__(self):
return ‘《name:%s price:%s period:%s》‘ %(self.name,self.price,self.period)
egon=Teacher(‘egon‘,18)
print(egon) #egon.__str__()
>>:
<name:egon age:18>
python=Course(‘python‘,20000,‘6mon‘)
openstack=Course(‘openstack‘,10,‘3mon‘)
linux=Course(‘linux‘,1,‘1mon‘)
egon.courses.append(python)
egon.courses.append(openstack)
egon.courses.append(linux)
# egon.courses.extend([python,openstack,linux])
print(egon.courses)
for obj in egon.courses:
print(obj)
>>:
[<__main__.Course object at 0x0000027F4FF70748>, <__main__.Course object at 0x0000027F4FF70780>, <__main__.Course object at 0x0000027F4FF70710>]
《name:python price:20000 period:6mon》
《name:openstack price:10 period:3mon》
《name:linux price:1 period:1mon》
析构方法,当对象在内存中被释放时,自动触发执行。
import time
class Foo:
def __init__(self,x):
self.x=x
print(‘connect mysql‘) #conn=abcdef(‘192.168.1.10‘,3306)
def __del__(self):
‘‘‘做一些与这个对象有关的清理操作‘‘‘
# conn.close()
# file.close()
print(‘====>‘)
f=Foo(10)
del f #f.__del__()
time.sleep(3)
print(‘主程序‘)
>>:
connect mysql
====>
主程序
f=Foo(10)
time.sleep(3)
print(‘主程序‘)
>>:
connect mysql
主程序
====>
class Foo:
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
def __getitem__(self, item):
# print(self,item,type(item))
# return getattr(self,item)
return self.__dict__[item]
def __setitem__(self, key, value):
# setattr(self,key,value)
self.__dict__[key]=value
def __delitem__(self, key):
# delattr(self,key)
self.__dict__.pop(key)
def __len__(self):
return 10
f=Foo(‘egon‘,18,‘male‘)
print(f.name) #f[‘name‘]
print(f.age) #f[‘age‘]
print(f.sex) #f[‘sex‘]
print(f[‘name‘])
f[‘name‘]=‘egon_nb‘
print(f.__dict__)
del f[‘name‘]
print(f.__dict__)
print(len(f))
>>: egon 18 male egon {‘name‘: ‘egon_nb‘, ‘age‘: 18, ‘sex‘: ‘male‘} {‘age‘: 18, ‘sex‘: ‘male‘} 10
Python基础(18)_面向对象程序设计2(反射、__str__、__del__、__item__系列)
原文:http://www.cnblogs.com/hedeyong/p/7132642.html