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 语句,这意味着我必须再次将返回的对象分配回 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">
但同样,笨拙。因为在将变量传递给方法之前,我必须将变量包装在列表中以使其可变。任何帮助表示赞赏,谢谢。
解决方案
我不会去那个兔子洞。即使分配回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'>
推荐阅读
- if-statement - 元组中带有搜索文本条件的 if 语句
- python - 当我打开这个抓取代码时,结果是空的
- android - 如何仅在连接到某些网络或 VPN 时运行 android 应用程序?
- jenkins - 使用 Jenkins 为本地 kubernetes 集群实施 CD?
- java - 如何按意图插入联系人生日日期
- ubuntu - 用来自另一个文件的不同文本逐行替换部分行
- google-apps-marketplace - Google Apps Marketplace 发布被拒绝
- batch-file - | 这时候出乎意料
- java - Android/Java - IO 异常 - 似乎无法加载 HTML 资产
- python-3.x - win32gui 选择两个同名窗口