Discuss / Python / 问一下

问一下

Topic source

setattr(obj, 'y', 19) 和 obj.y = 19直接实际上赋值有什么区别呢?

mf734

#2 Created at ... [Delete] [Delete and Lock User]

小白,如果有错请大佬纠正赐教。setattr可以进行更好的对向间的交互。

用这章例子打个比方:我有Cat类,有Dog类,现在我有一个husky的Dog和一个maine的Cat,我突然想不开,想把maine的“cat is running”的(猫的)run给我的husky。我可以getattr去拿maine的run方法,然后再setattr给husky的(狗的)run。这里就得用setattr,因为不能直接赋值给function call。

一盒噪噪

#3 Created at ... [Delete] [Delete and Lock User]

可以用getattr方法得到类中的函数,并赋值给一个变量名

再创建另一个类的变量名,把这个变量名赋值给它

例如:

class a:

    def q(self):

        pass

class b:

    pass

m=getattr(a,'q')

b.q=m

此时b中也有了a中的q函数

不只是名字或者功能相同,(就算是名字不同也无所谓)a中的q和b中的q就完完全全是同一个函数,当然了,和m也指向同一个函数

用setattr(b,'q',m)  这种方法也一样,此时的b.q和a.q和m都是同一个函数

我们不用取出一个类中函数中的(功能)内容赋给另一个类中的函数调用,只需要把函数名赋值给另一个函数名就可以了

zqdllym

#4 Created at ... [Delete] [Delete and Lock User]

请问大神,所以set的优越性是减少了get的繁琐程序吗

一盒噪噪

zqdllym

#5 Created at ... [Delete] [Delete and Lock User]

搬运一下我的百度搜索内容

效果其实是一样的。比如object.a = 1最终也是调用self.__setattr__('a', 1);
只不过如果你自己重写父类(object)的__setattr__方法时,在此基础上可以加上自己定义的一些规则

>>> setattr.__doc__

"Sets the named attribute on the given object to the specified value.\n\nsetattr(x, 'y', v) is equivalent to ``x.y = v''"

所以,没区别。

你想一下,=赋值语句不可以附加在另一行代码上,setattr就可以,这样就能使代码更简洁了


  • 1

Reply