这是我上一个问题的后续跟进,为什么一个方法的类中的setattr不起作用,我找到了答案,但现在我有一个小问题
class Test:
def myString(self, var):
Test.myString.string = var
return self.myString
然后我这样做
x = Test()
x.myString("test").string
它返回测试但我尝试了这个
y = list()
[y.append(x.myString(str(i))) for i in range(10)]
然后尝试通过执行此操作来获取列表,[j.string for j in y]
并返回9个九位总数。他们是一种解决这个问题的方法,所以它附加了当前的数字吗?
答案 0 :(得分:1)
这是一个非常奇怪的设计。我怀疑有一种更自然的方式可以做任何想做的事情。
那就是说,正在发生的是你的myString
方法设置了类方法本身的值。我从你上一个问题(Can you set an attribute to a method in python)中看到,调用bound方法每次都会创建一个绑定方法的新实例,所以你实际上从连续调用myString
方法返回了不同的对象,但是你总是在类的未绑定方法对象上更新单个值。通常,如果您要在类而不是实例上设置数据,那么您要为该类的所有实例设置该数据。
我无法弄清楚你在这里要做什么。很显然,你可以简单地得到0-9的字符串表示列表,但显然还有更多必需的东西。
更自然的设计就是在类实例上设置字符串 - 但它非常简单直接,实际上难以演示。
class Test:
pass
x = Test()
x.string = 'one'
print(x.string)
所以,再次,我只能假设你正在寻找更多参与的东西。
答案 1 :(得分:0)
我找到了两种方法来做我需要的东西,他们是为任何困惑或不知道如何做到这一点的人基本上 我想创建一个完整的新对象而不是使用相同的 一个,因为当我打电话时,它使用了它的最后一个数据,这就是为什么它之前没有用,所以使用 lambda 或 class 似乎工作正常,但如果其他人有不同的方式这样做,请告诉我。
# Option One
class Test:
def myString(self, string):
newObject = lambda: None
setattr(newObject,"string", string)
return newObject
myTest = Test()
myList = list()
[myList.append(myTest.myString(str(i))) for i in range(10)]
[attr.string for attr in myList] # Output: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
# Option Two
class newObject: pass
class Test:
def myString(self, string):
newObj = newObject()
setattr(newObj,"string", string)
return newObj
myTest = Test()
myList = list()
[myList.append(myTest.myString(str(i))) for i in range(10)]
[attr.string for attr in myList] # Output: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']