类型判断
issubclass
首先,我们先看issubclass() 这个内置函数可以帮我们判断x类是否是y类型的子类
class Base: pass class Foo(Base): pass class Bar(Foo): pass print(issubclass(Bar, Foo)) # True print(issubclass(Foo, Bar)) # False print(issubclass(Bar, Base)) # True
type
type(obj) 表示查看obj是由哪个类创建的
class Foo: pass obj = Foo() print(obj, type(obj)) # 查看obj的类
isinstance
isinstance可以判断x是否是y类的对象,isinstance可以判断该对象是否是家族体系中的(只能往上判断类)
class Base: pass class Foo(Base): pass class Bar(Foo): pass print(isinstance(Foo(), Foo)) # True print(isinstance(Foo(), Base)) # True print(isinstance(Foo(), Bar)) # False
反射
反射的四个函数
- hasattr(obj, str) 判断obj中是否包含str成员
- getattr(obj,str) 从obj中获取str成员。
- setattr(obj, str, value) 把obj中的str成员设置成value。这⾥的value可以是值,也可以是函数或者⽅法。
- delattr(obj, str) 把obj中的str成员删除掉。
importlib
importlib是一个可以根据字符串的模块名实现动态导入模块的库。
举个例子:
目录结构:
├── aaa.py ├── bbb.py └── mypackage ├── __init__.py └── xxx.py
使用importlib动态导入模块:
bbb.py
import importlib func = importlib.import_module('aaa') print(func) func.f1() m = importlib.import_module('mypackage.xxx') print(m.age)
类的其他成员
__str__
改变对象的字符串显示。可以理解为使用print函数打印一个对象时,会自动调用对象的__str__方法
class Student: def __init__(self, name, age): self.name = name self.age = age # 定义对象的字符串表示 def __str__(self): return self.name s1 = Student('张三', 24) print(s1) # 会调用s1的__str__方法
__repr__
在python解释器环境下,会默认显示对象的repr表示。
>>> class Student: ... def __init__(self, name, age): ... self.name = name ... self.age = age ... def __repr__(self): ... return self.name ... >>> s1 = Student('张三', 24) >>> s1 张三
总而言之:
str函数或者print函数调用的是obj.__str__()
repr函数或者交互式解释器调用的是obj.__repr__()
注意:
如果__str__没有被定义,那么就会使用__repr__来代替输出。
__str__和__repr__方法的返回值都必须是字符串。
__format__
class Student: def __init__(self, name, age): self.name = name self.age = age __format_dict = { 'n-a': '名字是:{obj.name}-年龄是:{obj.age}', # 名字是:lqz-年龄是:18 'n:a': '名字是:{obj.name}:年龄是:{obj.age}', # 名字是:lqz:年龄是:18 'n/a': '名字是:{obj.name}/年龄是:{obj.age}', # 名字是:/年龄是:18 } def __format__(self, format_spec): if not format_spec or format_spec not in self.__format_dict: format_spec = 'n-a' fmt = self.__format_dict[format_spec] print(fmt) #{obj.name}:{obj.age} return fmt.format(obj=self) s1 = Student('lqz', 24) ret = format(s1, 'n/a') print(ret) # lqz/24