123Marchapril 发表于 2021-4-7 23:25:43

关于setattr的疑惑

大家好,调用基类的setattr方法的时候为什么不加self呢?我的意思是,基类不应该明确是为哪一个子类的实例化对象的属性成功完成赋值吗?注:在我的理解中,成功完成赋值是指经过setattr方法之后,可以按照自己的想法(以自己设定的要求)顺利访问实例化对象的属性,我的疑惑是调用父类的setattr方法的时候,为什么不用加self?望大老用通俗易懂的话说说吧,谢谢!

TC_DHL 发表于 2021-4-8 00:46:42

class A():
    a1_1_1 = 'A类下的属性a1_1_1中的字符窜'

    def a1(self):
      self.a1_1 = '打印A类下的函数a1中的属性self.a1_1中的字符窜'
      print('1>>' + self.a1_1)

    def b1(self):
      self.b1_1 = '打印A类下的函数b1中的属性self.b1_1中的字符窜'
      print('2>>' + self.b1_1)

    def c1(self):
      emmm = self.a1_1_1
      print('3>>' + emmm)

class B(A):
    b1_1_1 = 'B类下的属性b1_1_1中的字符窜'

    def __init__(self):
      super().__init__()

prints = B()# 实例化
prints.a1()# 调用方法 a1
prints.b1()# 调用方法 b1

# setattr() 语法:setattr(object, name, value)
                        # object -- 对象。
                        # name   -- 字符串,对象属性(这个属性可以存在,也可以不存在)
                        # value-- 属性值。

prints_setattr_1 = A()# 实例化
prints_setattr_2 = B()# 实例化

print('4>>' + prints_setattr_1.a1_1_1)# 直接打印属性a1_1_1
prints_setattr_2.c1()# 调用方法c1

# object -- 对象, name -- 字符串, value -- 属性值
#把原本 属性a1_1_1 的值变更成 value 中的值
setattr(prints_setattr_1, 'a1_1_1', '我是setattr | prints_setattr_1')
print('5>>' + prints_setattr_1.a1_1_1)

setattr(prints_setattr_2, 'a1_1_1', '我是setattr | prints_setattr_2')
print('6>>' + prints_setattr_2.a1_1_1)

setattr(prints_setattr_2, 'a1_1_1_1_1_1_1_1_1', '不存在 | 自动创建')
print('7>>' + prints_setattr_2.a1_1_1_1_1_1_1_1_1)

prints_setattr_2.c1()# 调用方法c1 | 打印出的结果是 '我是setattr | prints_setattr_2'

终端打印的结果:
1>>打印A类下的函数a1中的属性self.a1_1中的字符窜
2>>打印A类下的函数b1中的属性self.b1_1中的字符窜
4>>A类下的属性a1_1_1中的字符窜
3>>A类下的属性a1_1_1中的字符窜
5>>我是setattr | prints_setattr_1
6>>我是setattr | prints_setattr_2
7>>不存在 | 自动创建
3>>我是setattr | prints_setattr_2

123Marchapril 发表于 2021-4-8 09:48:04

TC_DHL 发表于 2021-4-8 00:46
终端打印的结果:
1>>打印A类下的函数a1中的属性self.a1_1中的字符窜
2>>打印A类下的函数b1中的属性se ...

谢谢您,码了这么多代码,感激!我还想知道,在重写setattr魔法方法的时候,为了避免无限递归,最后要调用object类的__setattr__魔法方法,通常都是这样写:super().__setattr__(name,value),为什么不是这样写呢:super().__setattr__(self,name,value)?我的疑惑是子类调用了父类的魔法方法,那为什么不明确对象是子类的self呢?谢谢您,万望解答!

TC_DHL 发表于 2021-4-8 17:16:47

123Marchapril 发表于 2021-4-8 09:48
谢谢您,码了这么多代码,感激!我还想知道,在重写setattr魔法方法的时候,为了避免无限递归,最后要调 ...

你先看这一篇<点击访问>
然后在看这一篇<点击访问>

123Marchapril 发表于 2021-4-8 20:42:43

TC_DHL 发表于 2021-4-8 17:16
你先看这一篇
然后在看这一篇

是不是也可以这么理解,子类调用父类的方法,子类的实例化对象把自己传递给父类方法的self?

TC_DHL 发表于 2021-4-8 21:11:41

123Marchapril 发表于 2021-4-8 20:42
是不是也可以这么理解,子类调用父类的方法,子类的实例化对象把自己传递给父类方法的self?

你这么理解好像不是很对
建议你@Twilight6 找下这位大佬给你醍醐灌顶一下

123Marchapril 发表于 2021-4-8 21:16:33

TC_DHL 发表于 2021-4-8 21:11
你这么理解好像不是很对
建议你@Twilight6 找下这位大佬给你醍醐灌顶一下

好的,非常感谢您!

123Marchapril 发表于 2021-4-8 23:11:21

123Marchapril 发表于 2021-4-8 21:16
好的,非常感谢您!

联系不上,而且我的帖子可能被屏蔽了,您能帮我问问吗?
页: [1]
查看完整版本: 关于setattr的疑惑