在Python 2.6(或更早)的hex()
和oct()
内置函数可以以类通过定义重载__hex__
和__oct__
特殊功能。 但是没有一个__bin__
超载Python 2.6中的新的行为特殊功能bin()
的内置功能。
我想知道是否有灵活地超载任何方式bin()
如果不是我想知道为什么不一致的接口?
我不知道__index__
特殊功能可以使用,但是这并不灵活,因为它只能返回一个整数。 我的具体使用情况是从比特串模块,其中前导零位被认为是显著:
>>> a = BitString(length=12) # Twelve zero bits
>>> hex(a)
'0x000'
>>> oct(a)
'0o0000'
>>> bin(a)
'0b0' <------ I want it to output '0b000000000000'
我怀疑,有没有实现这一目标的方式,但我认为它不会伤害问!
正如你已经发现了,你不能覆盖bin()
但它听起来并不像你需要做的。 你只想要一个填充0的二进制值。 不幸的是在Python 2.5和以前的,你不能使用“%B”表示二进制的,所以你不能使用“%”字符串格式化操作达到你想要的结果。
幸运的是,Python 2.6中没有提供你想要什么,在新的形式str.format()方法。 我相信,线噪声的特定位是你在找什么:
>>> '{0:010b}'.format(19)
'0000010011'
这个迷你语言的语法是在“ 格式化规范的迷你语言的文档”。 为了节省您的时间,我会解释我使用的字符串:
- 参数为零(即
19
)应该被格式化,使用 - 一个神奇的“
0
”,以表明我想填充0,右对齐人数, - 的精度10位数字,在
- 二进制格式。
你可以使用这个语法来实现各种调整和填充的创意版本。
我想简单的答案是:“不, bin()
不能超载像oct()
和hex()
。”
至于为什么,答案必须使用Python 3.0,它采用骗__index__
超载hex()
oct()
和bin()
并且去掉了__oct__
和__hex__
完全特殊功能。
所以python的2.6 bin()
看上去很像是真的一个Python 3.0的功能,已经回油口不认为它做的事情新的Python 3的方式,而不是旧的Python 2路太多的考虑。 我还猜想,它不可能得到固定,即使它被认为是一个错误。
该回收站功能接收它是从对象的值__index__
功能。 因此,对于一个对象,你可以定义转换为二进制值,但是你不能定义字符串的格式。
你可以达到同样的行为为十六进制和十月通过重写/用你自己的实现更换内置斌()函数试图调用传递的对象上bin和回落到标准箱()函数,如果对象没“T提供斌 。 然而,其依据是明确优于隐式,编码您的应用程序依赖于斌(定制版)上可能不是一个好主意,所以也许只是给功能不同的名称,如
def mybin(n):
try:
return n.__bin__()
except AttributeError:
return bin(n)
至于接口为什么不一致,我不知道。 也许是因为滨()是最近所以这是一个轻微的疏忽添加?