关于类:如何在python中使用 __init__方法?

How to use __init__ method in Python?

本问题已经有最佳答案,请猛点这里访问。

我正在为十六进制值创建十六进制类。__init__方法需要十六进制字符串,但我希望能够从十进制整数创建十六进制实例,因此我为它创建了一个方法。代码如下:

1
2
3
4
5
6
7
8
class Hex:

    def __init__(self, val):
        #val should be a hex string
        self.val = val

    def from_dec(self, x):
        self.__init__(self, hex(x))

但是,当我跑步时:

1
2
a = Hex.from_dec(20)
print a.val

我得到以下错误:

1
2
TypeError: unbound method from_dec() must be called with Hex instance
as first argument (got int instance instead)

如何正确使用__init__


一种相当惯用的方法是使from_dec成为类方法:

1
2
3
4
5
6
7
8
9
10
11
12
class Hex:

    def __init__(self, val):
        #val should be a hex string
        self.val = val

    @classmethod
    def from_int(cls, x):
        return(Hex(hex(x)))

print Hex('0xab').val
print Hex.from_int(99).val


方法from_dec的第一个参数是self,这意味着需要类Hex的对象。

我将在类外部创建一个方法,从十进制输入创建十六进制对象。

1
2
3
4
5
6
7
8
def from_dec(x):
    return Hex(hex(x))

class Hex:

    def __init__(self, val):
        #val should be a hex string
        self.val = val

或者更改构造函数的输入参数。

1
2
3
4
5
6
7
8
9
10
class Hex:

    def __init__(self, val, dec=False):
        #val should be a hex string, unless dec=True
        if dec:
            self.val = hex(val)
        else:
            self.val = val

h = Hex(20, dec=True)


当调用class'函数时,不要包含第一个参数(请阅读python文档中关于类的内容!).

这将正常工作:

1
2
def from_dec(self, x):
    self.__init__(hex(x))

但是,最好分配给变量,而不是使用init,它只应在对象初始化期间运行。

1
2
def from_dec(self, x):
    self.val = hex(self.val)