Python继承和反射

代码测试环境: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类中的ac属性

继承

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被删了,所以冇打印
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小基基o_O

您的鼓励是我创作的巨大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值