Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何控制我的类的类型转换_Python_Python 3.x - Fatal编程技术网

Python 如何控制我的类的类型转换

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

如何控制类的类型转换?我知道有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 = 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”并不是一个真正有用的概念。构造函数接受对象并返回给定类型的对象。