首页 > 解决方案 > 访问类的“自我”属性的正确方法

问题描述

我有两个对象,我从 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 语句,这意味着我必须再次将返回的对象分配回 a ,语法将类似于:

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

但同样,笨拙。因为在将变量传递给方法之前,我必须将变量包装在列表中以使其可变。任何帮助表示赞赏,谢谢。

标签: pythonsubclasscustom-data-type

解决方案


我不会去那个兔子洞。即使分配回self会起作用,调试和维护也将是一场噩梦。

我会使用类方法来允许从另一种类型创建一种类型。分配回去并不比在引擎盖下偷偷改变类型更笨拙。

类方法是 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'>

推荐阅读