Python 如何控制我的类的类型转换
如何控制类的类型转换?我知道有uuu int uuuuuuuu()或uuuu str uuuuuuuuuuuuuuuuuu(),但其他类型的呢?我有两门课,点和向量。是否可以执行以下操作:Python 如何控制我的类的类型转换,python,python-3.x,Python,Python 3.x,如何控制类的类型转换?我知道有uuu int uuuuuuuu()或uuuu str uuuuuuuuuuuuuuuuuu(),但其他类型的呢?我有两门课,点和向量。是否可以执行以下操作: point = Point(1, 2, 3) # the following should not call Vector._init_(), but use a cast defined in Point # (something like Point.__Vector__()) vector = Vec
point = Point(1, 2, 3)
# the following should not call Vector._init_(), but use a cast defined in Point
# (something like Point.__Vector__())
vector = Vector(point)
这可能吗?如果是这样的话,我如何才能做到这样的行为?如果没有,我可以为哪些标准类型定义一个cast函数来允许,例如tuple(点)或list(点)-在python文档中找不到这一点。您可以通过使用
类方法来实现
比如说,
from point import Point # where the Point object is defined
class Vector:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
@classmethod
def from_point(cls, point):
if not isinstance(point, Point): # some validation first
raise TypeError("The given object is not of type 'Point'")
return cls(point.x, point.y, point.z)
# other methods
因此,如果你有一个p=Point(1,0,0)
,那么你可以做v=Vector.from_Point(p)
,你就会得到你想要的
有很多改进可以应用,但取决于点的详细信息
参见第二个答案@这不是我想要的。但在阅读时,我无意中发现了python文档中的一个列表——我想casting只支持int float和complex的内置函数,甚至不支持list等。在这种情况下,我必须坚持使用方法来实现类型转换(如Point.getVector()或Point.getList())您可以修改Vector.\uuuuu init\uuuuuuu
以查看是否传递了特定类型的对象(例如点
),并相应地进行处理。“强制转换”实际上不是一件不同的事情,在每种情况下,您都只是将对象传递给构造函数。内置类型使用作为Python数据模型一部分的钩子,但是没有任何东西阻止您在向量中实现接受点的\uuuu init\uuuu
type@natter1同样,您可以随意实现您的构造函数。如果你想公开一个钩子,只需记录它和你的向量。你可以尝试调用一个obj。对于向量方法,与内置类型相比没有什么不同,简单地说,钩子不是数据模型的一部分。在纯面向对象的动态类型语言(如Python)中,“Casting”并不是一个真正有用的概念。构造函数接受对象并返回给定类型的对象。