设置python的属性

设置python的属性,python,python-3.x,Python,Python 3.x,这是我上一个问题的后续问题,关于为什么方法类中的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

这是我上一个问题的后续问题,关于为什么方法类中的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代表y中的j]
,它将返回9位中的9位。他们是否有办法解决这个问题,使其附加当前的号码

这是一个非常奇怪的设计。我怀疑有一种更自然的方式来做这件事

也就是说,您的
myString
方法在类方法本身上设置值。我从前面的问题()中看到,每次调用绑定方法都会创建绑定方法的一个新实例,因此实际上,您从对
myString
方法的连续调用中返回了不同的对象,但您总是在更新类的未绑定方法对象上的单个值。通常,如果要在类而不是实例上设置数据,则要为该类的所有实例设置该数据

我搞不懂你在这里想干什么。显然,您可以得到一个0-9的字符串表示的列表,但显然需要更多的东西

一个更自然的设计只是在类实例上设置字符串——但它如此简单和直接,实际上很难演示

class Test:
    pass

x = Test()
x.string = 'one'
print(x.string)

所以,再一次,我只能假设你在寻找更复杂的东西。

这是一个非常奇怪的设计。我怀疑有一种更自然的方式来做这件事

也就是说,您的
myString
方法在类方法本身上设置值。我从前面的问题()中看到,每次调用绑定方法都会创建绑定方法的一个新实例,因此实际上,您从对
myString
方法的连续调用中返回了不同的对象,但您总是在更新类的未绑定方法对象上的单个值。通常,如果要在类而不是实例上设置数据,则要为该类的所有实例设置该数据

我搞不懂你在这里想干什么。显然,您可以得到一个0-9的字符串表示的列表,但显然需要更多的东西

一个更自然的设计只是在类实例上设置字符串——但它如此简单和直接,实际上很难演示

class Test:
    pass

x = Test()
x.string = 'one'
print(x.string)

所以,再一次,我只能假设你在寻找更复杂的东西。

我找到了两种方法来做我需要的事情,它们适用于那些困惑或不知道如何做的人基本上我想创建一个完整的新对象,而不是使用相同的对象,因为当我调用它时,它使用了它的最后一个数据,这就是为什么它会这样做以前没有工作过,所以使用lambda似乎很好,但如果其他人有不同的方法,请告诉我

# 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']

我在这里找到了两种方法来做我需要的事情,它们适用于任何困惑或不知道如何做的人基本上我想创建一个完整的新对象,而不是使用相同的对象,因为当我调用它时,它使用了它的最后一个数据,这就是为什么它在使用lambda课堂似乎很好,但如果其他人有不同的方法,请告诉我

# 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']


你没有得到属性错误:'instancemethod'对象没有属性'string'?@thefourtheye:OP必须使用3.X。是的,我使用的是python3.3.3。很抱歉,我没有澄清这是你试图解决的问题吗?可能还有更好的方法。你没有得到
AttributeError:'instancemethod'对象没有属性'string'
?@thefourtheye:OP必须使用3.X。是的,我使用的是python3.3.3。很抱歉,我没有澄清这是你试图解决的问题吗?可能有更好的方法。我正试图让它附加9个对象,数字为0-9,就像你说的那样。我只想能够像
[variable.string for variable in listHere]
那样调用它们。在我的屁股里,它会通过
[j.string for j in y]
我知道[str(I)for I in range(10)]如果你想要9个对象,你打算在哪里实例化这9个不同的对象?您可以在列表理解中轻松地执行此操作,但在示例代码中,您只需实例化一次
x
。也就是说,您发布的代码直接更改类本身的数据(
Test.myString.string
),因此使用此代码,不管您有多少实例,它们都不会跟踪
string
本身,而是在类上设置它。这是设计古怪的一部分。我真的很想知道为什么要在方法上有属性,而不是在对象中只有成员数据。@ruler:为什么要在方法上有属性?这是一个非常奇怪的放置数据的地方。希望这将有助于理解我为什么希望这样做:我正试图让它用数字0-9附加9个对象,就像你所说的,只是我希望能够像
[variable.string for variable in list here]
在我的屁股里那样调用它们
[j.string for j in y]
但是我知道[str(I)for I in range(10)]会给我相同的结果,但我不是在追求这个结果如果你想要9个对象,你打算在哪里实例化9个不同的对象?您可以在列表理解中轻松地执行此操作,但在示例代码中,您只需实例化一次
x
。也就是说,您发布的代码直接更改类本身的数据(
Test.myString.string
),因此使用此代码,不管您有多少实例,它们都不会跟踪
string
本身,而是在cl上设置