2

在 python 中有一个关于类型的方法int,即int.from_bytes. 它不是特定 int 上的方法,而是类型上的方法。例如

>>> int.from_bytes(b'\xee\xff',"big")
61183

>>> int.from_bytes
<built-in method from_bytes of type object at 0x107fdb388>

我如何定义这样的东西?假设定义了一个名为“point”的类,我该如何定义类似

>>> point.from_coordinates(3,5)
<__main__.point object at 0x10c0c9310>

>>> point.from_keys(b'\x12\x3e')
<__main__.point object at 0x10bed5890>

? (假设点是通过一些不同的方法初始化的。)

4

2 回答 2

6

你想要classmethod的,通常用作装饰器:

class point(object):
    @classmethod
    def from_coordinates(cls, x, y):
        pt = cls()
        pt.x, pt.y = x, y
        return pt

这有时被称为“替代构造函数”习语。如果有多种不同的方法来构造你的类型,而不是将它们全部放入一个__init__带有一堆可选参数或可变参数的方法中,而是将它们全部放入单独classmethod的 s 中。

于 2013-06-24T20:26:35.070 回答
3

您可以使用 a classmethod,例如需要整数的模拟示例,但也提供了一种尝试获取字符串并将它们转换为整数init的便利...from_hex

class MyClass(object):
    def __init__(self, a, b):
        self.a = a
        self.b = b
    @classmethod
    def from_hex(cls, a, b):
        return cls(int(a, 16), int(b, 16))

知道它与from_hex哪个类相关联,因此通过调用cls(...)您可以构造一个类型,MyClass就好像您自己MyClass(a, b)使用有效整数编写的一样。

于 2013-06-24T20:27:55.703 回答