最近学习了一些常用的python魔法方法,将自己的学习笔记分享一下,希望大喜欢。也希望能对大家有帮助。话不多说!
一.isinstance(obj, cls)与issubclass(sub, super)方法
- isinstance(obj, cls)检查obj是否是cls类的对象,是返回True,不是False.
- issubclass(sub, super)检查sub类是否是super类的派生类。
class Foo(object):
pass
obj = Foo()
isinstance(obj, Foo) # 返回True
class Foo(object):
pass
class Bar(Foo):
pass
issubclass(Bar, Foo) # 返回True
二.反射
反射指的是程序可以访问,检测和修改它自己状态行为的一种能力(自省)。通过字符串的形式操作对象相关的属性。
四个可以实现自省的函数。
- hasattr(obj, name)判断判断一个对象里是否有name属性或者方法,返回bool值。name需要用引号括起来。
- getattr(obj, name[, default])函数
获取对象obj的name属性或者方法,存在用print打印出来(不存在打印默认值),注意:若name是一个方法,用print打印的是其内存地址,若要执行这个方法,则在其后添加括号() - setattr(obj, name, values) 给对象obj的name属性赋values值,若属性不存在则先创建在赋值。
- delattr(obj, name)删除对象obj的name属性或者方法,不存在则报错。
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')) # 对象b1有name属性,返回True
print(hasattr(b1, 'sell_house')) # 对象b1有sell_house方法,返回True
print(hasattr(b1, 'age')) # 对象b1没有age属性,返回False
print(getattr(b1, 'name'))
print(getattr(b1, 'sell_house')) # 获得对象的sell_house方法的内存地址
setattr(b1, 'name', '年年有余') # 设值对象的name属性
print(getattr(b1, 'name'))
print(hasattr(b1, 'name'))
delattr(b1, 'name') # 删除对象的name属性,若对象没有此属性,报错
print(hasattr(b1, 'name'))
# delattr(b1, 'gae')
python中万物皆对象
# 类也是对象,故这四种方法对类也适用
class Foo(object):
staticField = "old boy"
def __init__(self):
self.name = 'wupeiqi'
def func(self):
return 'func'
@staticmethod
def bar():
return 'bar'
print(getattr(Foo, 'staticField'))
print(getattr(Foo, 'func'))
print(getattr(Foo,