学习python中遇到的问题
>>> class B:def __getattr__(self, attrname):
self.attrname = 956
>>> b = B()
>>> b.name
>>> b.name
>>> b.__dict__
{'attrname': 956}
各位大神 能否问一下为什么这里不是 b.name = 956;而是b.attrname = 956 你上面就是self.attrname,你哪来的name呢 class B 没有设置 name 属性,在你访问 b . name 时,触发了 __getattr__() 方法,从而,为 b 创建了一个名为 attrname 的属性,并为其赋值 956。
>>> class B:
def __getattr__(self, attrname):
self.attrname = 956
>>> b = B()
>>> b.__dict__
{}
>>>
>>> b.name
>>> b.__dict__
{'attrname': 956}
>>> jackz007 发表于 2022-8-22 22:20
class B 没有设置 name 属性,在你访问 b . name 时,触发了 __getattr__() 方法,从而,为 b 创建 ...
attrname 不是形式参数吗 我想要的效果是: 当对象没有某个属性时候 就为这个属性赋值为956
比如他没有name属性 我就想 让他的name = 956;他没有age属性 就让他的age属性为956
但是这个为什么只能设置attrname呢 我不明白的地方就在这里 能不能帮我解答一下 谢谢你
临时号 发表于 2022-8-22 22:17
你上面就是self.attrname,你哪来的name呢
我的问题写在了楼下 麻烦帮忙看一看 谢谢你{:5_111:} Archerwan_ 发表于 2022-8-23 09:43
我的问题写在了楼下 麻烦帮忙看一看 谢谢你
class A:
def __getattr__(self,attrname):
self.__dict__ = 956 临时号 发表于 2022-8-23 10:12
明白了 但为什么那样做不行呢?? Archerwan_ 发表于 2022-8-23 10:13
明白了 但为什么那样做不行呢??
在__getattr__函数中,self.attrname = 956的意思是在类中创建一个名叫attrname的变量赋值为956 临时号 发表于 2022-8-23 10:25
在__getattr__函数中,self.attrname = 956的意思是在类中创建一个名叫attrname的变量赋值为956
是所有函数都这样吗 Archerwan_ 发表于 2022-8-23 10:34
是所有函数都这样吗
self.attrname和attrname是不同的两个东西
self.attrname是类成员变量,attrname是函数的局部变量,我懂你的意思,甚至有点像我刚学的时候
你的意思是把attrname填到self.()中的括号中,然后因为attrname的值是"name",所以你以为最后会变成self.name = 956
但这样是不行的,这种想法就相当于"name" = 956会创造一个叫name的变量差不多 临时号 发表于 2022-8-23 10:44
self.attrname和attrname是不同的两个东西
self.attrname是类成员变量,attrname是函数的局部变量,我懂你 ...
是的我就是这个意思
但是能不能再解释一下 b.__dict__ = 956就能实现效果呢
是不是因为这里的attrname不属于类成员变量呢 Archerwan_ 发表于 2022-8-23 11:19
是的我就是这个意思
但是能不能再解释一下 b.__dict__ = 956就能实现效果呢
是不是因为这里 ...
这里的attrname存储的是"name"这个字符串
一个成员变量肯定是保存在self.__dict__中的,你刚刚也通过b.__dict__看到了当前b的成员变量
所以,反过来是不是只要一个键值对保存在self.__dict__中,是不是就说明这个变量就是成员变量
所以这里我把attrname和他的值956写到了self.__dict__这个字典中,使得name成为了一个成员变量 临时号 发表于 2022-8-23 11:34
这里的attrname存储的是"name"这个字符串
一个成员变量肯定是保存在self.__dict__中的,你刚刚也通过b.__ ...
也就是说 self.attrname 访问的是字典里面的成员变量 是这样吗 Archerwan_ 发表于 2022-8-23 11:43
也就是说 self.attrname 访问的是字典里面的成员变量 是这样吗
self.attrname就是访问成员变量的,只不过,只要把一个键值对加到那个字典中,那么,那个键就成为了成员变量 Archerwan_ 发表于 2022-8-23 11:43
也就是说 self.attrname 访问的是字典里面的成员变量 是这样吗
这样说吧
self.name = 956等同于self.__dict__["name"] = 956 临时号 发表于 2022-8-23 11:48
self.attrname就是访问成员变量的,只不过,只要把一个键值对加到那个字典中,那么,那个键就成为了成员变量
明白了 谢谢您
页:
[1]