访问 class 的 "self" 属性 的正确方法
The proper way to access the "self" property of a class
我有两个从 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”关键字,但我这样放是为了说明。我希望对象能够将自身更改为另一个对象,这是否可能而不必在“还原”方法中使用 return 语句?因为如果我使用 return 语句,这意味着我必须再次将 returned 对象分配回 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'>
这不是对象的工作方式。 self
是对对象的引用。即使您在函数范围内更改它,也不会更改对象本身。您应该了解有关面向对象编程的更多信息以及什么是对象以及为什么不应该动态更改其类型。
但是,您可以使用 @staticmethod
和 @staticmethod
带注释的静态或 class 方法,它们可以 return 一个 new 对象从您想要的类型创建。
或者另一种选择是创建一个类似 to_mystr
的方法,该方法对给定对象进行操作,returns 是从您的对象创建的对象(转换为另一种类型)。
我有两个从 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”关键字,但我这样放是为了说明。我希望对象能够将自身更改为另一个对象,这是否可能而不必在“还原”方法中使用 return 语句?因为如果我使用 return 语句,这意味着我必须再次将 returned 对象分配回 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'>
这不是对象的工作方式。 self
是对对象的引用。即使您在函数范围内更改它,也不会更改对象本身。您应该了解有关面向对象编程的更多信息以及什么是对象以及为什么不应该动态更改其类型。
但是,您可以使用 @staticmethod
和 @staticmethod
带注释的静态或 class 方法,它们可以 return 一个 new 对象从您想要的类型创建。
或者另一种选择是创建一个类似 to_mystr
的方法,该方法对给定对象进行操作,returns 是从您的对象创建的对象(转换为另一种类型)。