代码测试环境:WIN10+Pycharm+Python 3.9.7
内置函数:dir
dir([object]) -> list of strings
- 如果不带参数调用,则返回当前作用域中的名称(打印结果如下)
print(dir())
# ['__annotations__', '__builtins__', '__cached__', '__doc__',
# '__file__', '__loader__', '__name__', '__package__', '__spec__']
- 如果带参数
返回 按字母序排列 的 名称列表
列表包含:给定对象的 部分属性
class A:
b = 1234
__c = 5678
print(dir(A()))
# ['_A__c', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__',
# '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__',
# '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__',
# '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
# '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'b']
继承
非继承
class A:
def __init__(self, a):
self.a = a
self.c = 'ccc'
def get_a(self):
print(self.a)
class B:
def __init__(self, b):
A.__init__(self, b)
# 实例化B
obj = B('a')
# 遍历B类对象的属性
for attr in dir(obj):
if not attr.startswith('_'):
print(attr)
-
打印结果
-
a
c
B没有继承A,但有A类中的
a
和c
属性
继承
class A:
def __init__(self, a):
self.a = a
def get_a(self):
print(self.a)
class B(A):
def __init__(self, b):
A.__init__(self, b)
print('\n'.join(i for i in dir(B('a'))if not i.startswith('_')))
-
打印结果
-
a
get_a
B类对象 不但 有A类的属性
a
,还有 方法get_a
连续继承
class A:
def __init__(self):
self.a = 1
def get_a(self):
print(self.a)
class AA(A):
def __init__(self, aa):
super().__init__()
self.aa = aa
class B(AA):
def __init__(self, aa, b):
super().__init__(aa)
self.b = b
print('\n'.join(i for i in dir(B('a', 'b'))if not i.startswith('_')))
a
aa
b
get_a
多继承
可以看到super().__init__()
和B.__init__(self)
有区别
class A:
def __init__(self):
self.a = 1
def get_a(self):
print(self.a)
class B:
def __init__(self):
self.b = 2
def get_b(self):
print(self.b)
class C(A, B):
def __init__(self, c):
super().__init__()
self.c = c
print('\n'.join(i for i in dir(C(3))if not i.startswith('_')))
a
c
get_a
get_b
class A:
def __init__(self):
self.a = 1
def get_a(self):
print(self.a)
class B:
def __init__(self):
self.b = 2
def get_b(self):
print(self.b)
class C(A, B):
def __init__(self, c):
A.__init__(self)
B.__init__(self)
self.c = c
print('\n'.join(i for i in dir(C(3))if not i.startswith('_')))
a
b
c
get_a
get_b
反射
把字符串反射成内存对象
hasattr
:返回 对象 是否 具有 给定名称的属性getattr
:从对象中获取命名属性setattr
:给指定对象的指定属性设置为值delattr
:从指定对象中删除指定属性
class A:
def __init__(self, a):
self.a = a
def get_a(self):
print(self.a)
obj = A('abcd')
# hasattr:返回 对象 是否 具有 给定名称的属性
print(hasattr(obj, 'get_a'))
# 打印结果:True
# getattr:从对象中获取命名属性;等价于 obj.a
print(getattr(obj, 'a'))
# 打印结果:abcd
# setattr:给指定对象的指定属性设置为值
setattr(obj, 'e', 'eee')
print(obj.e)
# 不报错,打印结果:eee
# delattr:从指定对象中删除指定属性
delattr(obj, 'a')
print(','.join(i for i in dir(obj)if not i.startswith('_')))
# 打印结果:e,get_a
# a被删了,所以冇打印