鱼C论坛

 找回密码
 立即注册
查看: 2548|回复: 15

[已解决]学习python中遇到的问题

[复制链接]
发表于 2022-8-22 22:04:17 | 显示全部楼层 |阅读模式

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

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

x
  1. >>> class B:
  2.         def __getattr__(self, attrname):
  3.                 self.attrname = 956

  4.                
  5. >>> b = B()
  6. >>> b.name
  7. >>> b.name
  8. >>> b.__dict__
  9. {'attrname': 956}
复制代码





各位大神 能否问一下为什么这里不是 b.name = 956;而是b.attrname = 956
最佳答案
2022-8-23 11:34:03
Archerwan_ 发表于 2022-8-23 11:19
是的我就是这个意思
但是能不能再解释一下 b.__dict__[attrname] = 956就能实现效果呢
是不是因为这里 ...

这里的attrname存储的是"name"这个字符串
一个成员变量肯定是保存在self.__dict__中的,你刚刚也通过b.__dict__看到了当前b的成员变量
所以,反过来是不是只要一个键值对保存在self.__dict__中,是不是就说明这个变量就是成员变量
所以这里我把attrname和他的值956写到了self.__dict__这个字典中,使得name成为了一个成员变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-22 22:17:41 | 显示全部楼层
你上面就是self.attrname,你哪来的name呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-22 22:20:47 | 显示全部楼层
        class B 没有设置 name 属性,在你访问 b . name 时,触发了 __getattr__() 方法,从而,为 b 创建了一个名为 attrname 的属性,并为其赋值 956。
  1. >>> class B:
  2.         def __getattr__(self, attrname):
  3.                 self.attrname = 956

  4.                
  5. >>> b = B()
  6. >>> b.__dict__
  7. {}
  8. >>>
  9. >>> b.name
  10. >>> b.__dict__
  11. {'attrname': 956}
  12. >>>
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-23 09:41:04 | 显示全部楼层
jackz007 发表于 2022-8-22 22:20
class B 没有设置 name 属性,在你访问 b . name 时,触发了 __getattr__() 方法,从而,为 b 创建 ...

attrname 不是形式参数吗 我想要的效果是: 当对象没有某个属性时候 就为这个属性赋值为956
比如他没有name属性 我就想 让他的name = 956;他没有age属性 就让他的age属性为956
但是这个为什么只能设置attrname呢 我不明白的地方就在这里 能不能帮我解答一下 谢谢你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-23 09:43:37 | 显示全部楼层
临时号 发表于 2022-8-22 22:17
你上面就是self.attrname,你哪来的name呢

我的问题写在了楼下 麻烦帮忙看一看 谢谢你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-23 10:12:28 | 显示全部楼层
Archerwan_ 发表于 2022-8-23 09:43
我的问题写在了楼下 麻烦帮忙看一看 谢谢你
  1. class A:
  2.     def __getattr__(self,attrname):
  3.         self.__dict__[attrname] = 956
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-23 10:13:26 | 显示全部楼层

明白了 但为什么那样做不行呢??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-23 10:25:56 | 显示全部楼层
Archerwan_ 发表于 2022-8-23 10:13
明白了 但为什么那样做不行呢??

在__getattr__函数中,self.attrname = 956的意思是在类中创建一个名叫attrname的变量赋值为956
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-23 10:34:02 | 显示全部楼层
临时号 发表于 2022-8-23 10:25
在__getattr__函数中,self.attrname = 956的意思是在类中创建一个名叫attrname的变量赋值为956

是所有函数都这样吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-23 10:44:18 | 显示全部楼层
Archerwan_ 发表于 2022-8-23 10:34
是所有函数都这样吗

self.attrname和attrname是不同的两个东西
self.attrname是类成员变量,attrname是函数的局部变量,我懂你的意思,甚至有点像我刚学的时候
你的意思是把attrname填到self.()中的括号中,然后因为attrname的值是"name",所以你以为最后会变成self.name = 956
但这样是不行的,这种想法就相当于"name" = 956会创造一个叫name的变量差不多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-23 11:19:34 | 显示全部楼层
临时号 发表于 2022-8-23 10:44
self.attrname和attrname是不同的两个东西
self.attrname是类成员变量,attrname是函数的局部变量,我懂你 ...

是的我就是这个意思
但是能不能再解释一下 b.__dict__[attrname] = 956就能实现效果呢
是不是因为这里的attrname不属于类成员变量呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-23 11:34:03 | 显示全部楼层    本楼为最佳答案   
Archerwan_ 发表于 2022-8-23 11:19
是的我就是这个意思
但是能不能再解释一下 b.__dict__[attrname] = 956就能实现效果呢
是不是因为这里 ...

这里的attrname存储的是"name"这个字符串
一个成员变量肯定是保存在self.__dict__中的,你刚刚也通过b.__dict__看到了当前b的成员变量
所以,反过来是不是只要一个键值对保存在self.__dict__中,是不是就说明这个变量就是成员变量
所以这里我把attrname和他的值956写到了self.__dict__这个字典中,使得name成为了一个成员变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-23 11:43:16 | 显示全部楼层
临时号 发表于 2022-8-23 11:34
这里的attrname存储的是"name"这个字符串
一个成员变量肯定是保存在self.__dict__中的,你刚刚也通过b.__ ...

也就是说 self.attrname 访问的是字典里面的成员变量 是这样吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-23 11:48:33 | 显示全部楼层
Archerwan_ 发表于 2022-8-23 11:43
也就是说 self.attrname 访问的是字典里面的成员变量 是这样吗

self.attrname就是访问成员变量的,只不过,只要把一个键值对加到那个字典中,那么,那个键就成为了成员变量
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-23 11:49:47 | 显示全部楼层
Archerwan_ 发表于 2022-8-23 11:43
也就是说 self.attrname 访问的是字典里面的成员变量 是这样吗

这样说吧
self.name = 956等同于self.__dict__["name"] = 956
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-8-23 11:52:26 | 显示全部楼层
临时号 发表于 2022-8-23 11:48
self.attrname就是访问成员变量的,只不过,只要把一个键值对加到那个字典中,那么,那个键就成为了成员变量

明白了 谢谢您
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 05:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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