希望标题不会太误导人,我不确定表达我的问题的最佳方式。
我正在尝试在 Python 中创建(X, Y)坐标数据类型。有没有办法创建“自定义数据类型”,以便我拥有一个具有值的对象,以及一些支持属性?
到目前为止,我已经做了这个简单的课程:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
self.tuple = (x, y)
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望能够做这样的事情:
>>> p = Point(4, 5)
>>>
>>> my_x = p.x # can access the `x` attribute with "dot syntax"
>>>
>>> my_tuple = p # or can access the tuple value directly
# without needing to do `.tuple`, as if the `tuple`
# attribute is the "default" attribute for the object
Run Code Online (Sandbox Code Playgroud)
注意我并不是想简单地显示元组,我知道我可以用该__repr__方法来做到这一点
在某种程度上,我试图创建一个非常简化的numpy.ndarray,因为ndarrays 是一种具有自己的属性的数据类型。我尝试查看numpy源代码以了解这是如何完成的,但这超出了我的能力范围,哈哈。
任何提示将不胜感激!
我不确定你想用这个元组做什么。p将永远是 的一个实例Point。你打算在那里做的事是行不通的。
如果您只是不想使用点符号,则可以使用 anamedtuple或 adataclass而不是类。tuple()然后使用和将它们的实例转换为元组astuple()。
from collections import namedtuple
Point = namedtuple("Point", ["x", "y"])
p = Point(4, 5)
x = p.x
y = p.y
xy = p # xy = tuple(p) not necessary since namedtuple is already a tuple
Run Code Online (Sandbox Code Playgroud)
注意:namedtuple是不可变的,即您不能更改x和y。
使用dataclasses.dataclass和dataclasses.astuple():
from collections import namedtuple
Point = namedtuple("Point", ["x", "y"])
p = Point(4, 5)
x = p.x
y = p.y
xy = p # xy = tuple(p) not necessary since namedtuple is already a tuple
Run Code Online (Sandbox Code Playgroud)