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

2024-04-29 16:32:10 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: 对象方法selfobjnewreturndeftype
2条回答

我不会从兔子洞里钻下去。即使重新分配给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注释的静态或类方法,这些方法可以返回从所需类型创建的对象

或者另一个选项是创建一个类似to_mystr的方法,该方法对给定对象进行操作,并返回从对象创建的对象(转换为其他类型)

相关问题 更多 >