我已经深入研究了Python类中的运算符重载和特殊方法,我注意到许多内置函数都有其等效的特殊方法名:
int(x)
调用x.__int__()
next(x)
在python2中调用x.__next__()
或x.next()
但是,一对函数,即tuple()
和dict()
,没有任何等价函数。我知道还没有出现对这种特殊方法的需求,但是在某些情况下,对类调用的dict()
转换方法可能是有用的。我该如何实现这一点?或者,你会怎么评价一个试图使用这种逻辑的人?你知道吗
# I think this is quite interesting, so I shall post my own implementation of it as well
以最简单的形式,我可以尝试检索
obj.__dict__
。我还创建了一个名为obj.__dictionary__
的方法,它返回dict
,但可以自定义返回的值和返回方式。我实现了一个小函数,它尝试调用obj.__dictionary__
和其他方法的其他连续尝试:为了演示,有一个小类封装了
'Person'
:现在考虑在几个对象上调用我的自定义
dct
函数来测试它:正如你所看到的,它似乎工作在一个体面的方式。我知道对于我的简单的
Person
类演示,我可以简单地返回p.__dict__
,但是我添加了一个额外的p.title
属性,该属性只以dict
形式存在,以表明这支持额外的定制。另外,如果我用__slots__
定义了Person
类,那么dct(p)
调用将失败显然,我可以扩展
try/except
块来尝试访问__slots__
,但这并不是我想说的重点:如果我在自定义__dictionary__
方法中定义了以下内容,代码将 按预期工作:选项1:
__iter__
转换为
tuple
或dict
,或任何采用iterable的类型,都依赖于__iter__
方法。你知道吗这同样适用于元组。你知道吗
选项2:
keys
和__getitem__
或者,要转换为
dict
,可以同时实现keys
和__getitem__
。你知道吗选项3:都支持多种类型
最后,如果希望类具有不同的行为来强制转换为
dict
和tuple
,下面的示例演示了dict
将优先考虑keys
和__getitem__
解决方案。你知道吗相关问题 更多 >
编程相关推荐