鱼C论坛

 找回密码
 立即注册
查看: 2882|回复: 7

[已解决]关于setattr的疑惑

[复制链接]
发表于 2021-4-7 23:25:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大家好,调用基类的setattr方法的时候为什么不加self呢?我的意思是,基类不应该明确是为哪一个子类的实例化对象的属性成功完成赋值吗?注:在我的理解中,成功完成赋值是指经过setattr方法之后,可以按照自己的想法(以自己设定的要求)顺利访问实例化对象的属性,我的疑惑是调用父类的setattr方法的时候,为什么不用加self?望大老用通俗易懂的话说说吧,谢谢!
最佳答案
2021-4-8 17:16:47
123Marchapril 发表于 2021-4-8 09:48
谢谢您,码了这么多代码,感激!我还想知道,在重写setattr魔法方法的时候,为了避免无限递归,最后要调 ...

你先看这一篇<点击访问>
然后在看这一篇<点击访问>
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-4-8 00:46:42 | 显示全部楼层
  1. class A():
  2.     a1_1_1 = 'A类下的属性a1_1_1中的字符窜'

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

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

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

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

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

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

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

  23. prints_setattr_1 = A()# 实例化
  24. prints_setattr_2 = B()# 实例化

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

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

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

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

  35. 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
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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呢?谢谢您,万望解答!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-8 17:16:47 | 显示全部楼层    本楼为最佳答案   
123Marchapril 发表于 2021-4-8 09:48
谢谢您,码了这么多代码,感激!我还想知道,在重写setattr魔法方法的时候,为了避免无限递归,最后要调 ...

你先看这一篇<点击访问>
然后在看这一篇<点击访问>
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-4-8 20:42:43 | 显示全部楼层
TC_DHL 发表于 2021-4-8 17:16
你先看这一篇
然后在看这一篇

是不是也可以这么理解,子类调用父类的方法,子类的实例化对象把自己传递给父类方法的self?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

你这么理解好像不是很对
建议你@Twilight6 找下这位大佬给你醍醐灌顶一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-8 21:16:33 | 显示全部楼层
TC_DHL 发表于 2021-4-8 21:11
你这么理解好像不是很对
建议你@Twilight6 找下这位大佬给你醍醐灌顶一下

好的,非常感谢您!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-8 23:11:21 | 显示全部楼层
123Marchapril 发表于 2021-4-8 21:16
好的,非常感谢您!

联系不上,而且我的帖子可能被屏蔽了,您能帮我问问吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-24 08:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表