Python 访问类的“self”属性的正确方法

Python 访问类的“self”属性的正确方法,python,subclass,custom-data-type,Python,Subclass,Custom Data Type,我从str和int类中对两个对象进行了子分类,并向其中添加了一个revert方法,该方法可以将一个对象转换为另一个对象: class newString(str): ... ... def revert(self, distance, obj): self = newInt(self) class newInt(int): ... ... def revert(self): self = newString(self

我从str和int类中对两个对象进行了子分类,并向其中添加了一个revert方法,该方法可以将一个对象转换为另一个对象:

class newString(str):
    ...
    ...
    def revert(self, distance, obj):
        self = newInt(self)
class newInt(int):
    ...
    ...
    def revert(self):
        self = newString(self)

a = newInt(2)
a.revert()
print(type(a))

#output
<class "newString">

我知道self关键字不能这样使用,但我把它放在这里是为了说明。我希望对象能够将自身更改为另一个,这是否可能,而不必在revert方法中使用return语句?因为如果我使用return语句,这意味着我必须再次将返回的对象分配回,语法如下:

class newString(str):
    ...
    ...
    def revert(self):
        new = newInt(self)
        return new
class newInt(int):
    ...
    ...
    def revert(self):
        new = newInt(self)
        return new

a = newInt(2)
a = a.revert()
print(type(a))

#output
<class "newString">
这对我来说总是有点笨拙,谢谢你

我所尝试的: 我试着通过引用来模拟传递;例如:

class newString(str):
    ...
    ...
    def revert(self, obj):
        obj[0] = newInt(obj[0])
class newInt(int):
    ...
    ...
    def revert(self, obj):
        obj[0] = newInt(obj[0])

a = newInt(2)
a.revert([a])
print(type(a))

#output
<class "newString">

但还是很笨拙。因为在将变量传递给方法之前,我必须将其包装在一个列表中,以使其可变。非常感谢您的帮助。

我不会从兔子洞里钻下去的。即使重新分配给self也会起作用,但调试和维护将是一场噩梦

我会使用classmethods来允许从一种类型创建另一种类型。分配回并不比在引擎盖下秘密更改类型更笨拙

classmethods是从Python中另一种类型的对象创建某种类型对象的惯用方法。对于Python不支持构造函数重载或任何方法重载这一事实,它本质上是一种变通方法

显式比隐式好

class newString(str):
    @classmethod
    def from_newInt(cls, new_int_obj):
        return cls(str(new_int_obj))


class newInt(int):
    @classmethod
    def from_newString(cls, new_string_obj):
        return cls(int(new_string_obj))

s = newString('1')
i = newInt(1)
print(type(newString.from_newInt(i)))
print(type(newInt.from_newString(s)))
# <class '__main__.newString'>
# <class '__main__.newInt'>

我不会从兔子洞里钻下去。即使重新分配给self也会起作用,但调试和维护将是一场噩梦

我会使用classmethods来允许从一种类型创建另一种类型。分配回并不比在引擎盖下秘密更改类型更笨拙

classmethods是从Python中另一种类型的对象创建某种类型对象的惯用方法。对于Python不支持构造函数重载或任何方法重载这一事实,它本质上是一种变通方法

显式比隐式好

class newString(str):
    @classmethod
    def from_newInt(cls, new_int_obj):
        return cls(str(new_int_obj))


class newInt(int):
    @classmethod
    def from_newString(cls, new_string_obj):
        return cls(int(new_string_obj))

s = newString('1')
i = newInt(1)
print(type(newString.from_newInt(i)))
print(type(newInt.from_newString(s)))
# <class '__main__.newString'>
# <class '__main__.newInt'>

这不是对象的工作方式。self是对对象的引用。即使在函数范围内更改它,也不是对对象本身的更改。您应该了解更多关于面向对象编程的知识,什么是对象以及为什么不应该动态更改其类型

但是,您可以使用@staticmethod和@staticmethod注释的静态方法或类方法,这些方法可以返回从所需类型创建的新对象


或者,另一种选择是创建一个类似于_mystr的方法,该方法对给定对象进行操作,并返回一个从您的对象创建的对象,该对象转换为另一种类型。

这不是对象的工作方式。self是对对象的引用。即使在函数范围内更改它,也不是对对象本身的更改。您应该了解更多关于面向对象编程的知识,什么是对象以及为什么不应该动态更改其类型

但是,您可以使用@staticmethod和@staticmethod注释的静态方法或类方法,这些方法可以返回从所需类型创建的新对象


或者,另一种选择是创建一个类似于_mystr的方法,该方法对给定对象进行操作,并返回从对象创建的对象,该对象转换为另一种类型。

旁注:self既不是类的属性,也不是传递到方法中的关键字。虽然我强烈建议你也使用这个名称,但它只是按惯例称为self。我希望这个对象能够将自身更改为另一个名称。为什么?实际上,我有点误用了关键字,因为没有更好的名称。原因是我在尝试创建变量,在它们更改时存储它们自己的历史,此处回购:;因此,revert方法将允许他们返回到以前的州际注释:self既不是传递给方法的类的属性,也不是关键字。虽然我强烈建议你也使用这个名称,但它只是按惯例称为self。我希望这个对象能够将自身更改为另一个名称。为什么?实际上,我有点误用了关键字,因为没有更好的名称。原因是我在尝试创建变量,在它们更改时存储它们自己的历史,此处回购:;因此,revert方法将允许他们返回到以前的状态Yep,毕竟是这样。就在你写评论的时候,我在我的答案中添加了这一点:@DeepSpace,但这样我仍然需要将返回的新字符串或int添加到一个新变量中,是吗?@TochiBedford是的,正如答案本身所写的那样:返回赋值并不比在引擎盖下秘密更改类型更笨拙。是的,毕竟是这样。就在你写评论的时候,我在我的答案中添加了这一点:@DeepSpace,但这样我仍然需要将返回的新字符串或int添加到一个新变量中,是吗?@TochiBedford是的,正如答案本身所写的那样:返回赋值并不比秘密地更改字符串更笨拙
是的,但是返回一个新对象并将其重新分配给一个新变量是我试图避免的,我认为这是无法避免的。我不太喜欢,但也许你可以用c语言编写一个库,可以重写一大块内存。是的,但是返回一个新对象并将其重新分配给一个新变量是我试图避免的,我认为这是无法避免的。我不是很喜欢这个,但也许你可以用c写一个库,可以重写一大块内存。