Archerwan_ 发表于 2022-8-22 22:04:17

学习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

临时号 发表于 2022-8-22 22:17:41

你上面就是self.attrname,你哪来的name呢

jackz007 发表于 2022-8-22 22:20:47

      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}
>>>

Archerwan_ 发表于 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呢 我不明白的地方就在这里 能不能帮我解答一下 谢谢你

Archerwan_ 发表于 2022-8-23 09:43:37

临时号 发表于 2022-8-22 22:17
你上面就是self.attrname,你哪来的name呢

我的问题写在了楼下 麻烦帮忙看一看 谢谢你{:5_111:}

临时号 发表于 2022-8-23 10:12:28

Archerwan_ 发表于 2022-8-23 09:43
我的问题写在了楼下 麻烦帮忙看一看 谢谢你

class A:
    def __getattr__(self,attrname):
      self.__dict__ = 956

Archerwan_ 发表于 2022-8-23 10:13:26

临时号 发表于 2022-8-23 10:12


明白了 但为什么那样做不行呢??

临时号 发表于 2022-8-23 10:25:56

Archerwan_ 发表于 2022-8-23 10:13
明白了 但为什么那样做不行呢??

在__getattr__函数中,self.attrname = 956的意思是在类中创建一个名叫attrname的变量赋值为956

Archerwan_ 发表于 2022-8-23 10:34:02

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

是所有函数都这样吗

临时号 发表于 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的变量差不多

Archerwan_ 发表于 2022-8-23 11:19:34

临时号 发表于 2022-8-23 10:44
self.attrname和attrname是不同的两个东西
self.attrname是类成员变量,attrname是函数的局部变量,我懂你 ...

是的我就是这个意思
但是能不能再解释一下 b.__dict__ = 956就能实现效果呢
是不是因为这里的attrname不属于类成员变量呢

临时号 发表于 2022-8-23 11:34:03

Archerwan_ 发表于 2022-8-23 11:19
是的我就是这个意思
但是能不能再解释一下 b.__dict__ = 956就能实现效果呢
是不是因为这里 ...

这里的attrname存储的是"name"这个字符串
一个成员变量肯定是保存在self.__dict__中的,你刚刚也通过b.__dict__看到了当前b的成员变量
所以,反过来是不是只要一个键值对保存在self.__dict__中,是不是就说明这个变量就是成员变量
所以这里我把attrname和他的值956写到了self.__dict__这个字典中,使得name成为了一个成员变量

Archerwan_ 发表于 2022-8-23 11:43:16

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

也就是说 self.attrname 访问的是字典里面的成员变量 是这样吗

临时号 发表于 2022-8-23 11:48:33

Archerwan_ 发表于 2022-8-23 11:43
也就是说 self.attrname 访问的是字典里面的成员变量 是这样吗

self.attrname就是访问成员变量的,只不过,只要把一个键值对加到那个字典中,那么,那个键就成为了成员变量

临时号 发表于 2022-8-23 11:49:47

Archerwan_ 发表于 2022-8-23 11:43
也就是说 self.attrname 访问的是字典里面的成员变量 是这样吗

这样说吧
self.name = 956等同于self.__dict__["name"] = 956

Archerwan_ 发表于 2022-8-23 11:52:26

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

明白了 谢谢您
页: [1]
查看完整版本: 学习python中遇到的问题