我已经编写了一系列函数,但一直在玩弄它们构建类的想法。我不想重写所有内容,而是想从课堂上给他们打电话。这样做的正确方法是什么?我能想到以下几点:
一个无聊的功能,但它提出了这个想法。
def my_func( a_dict, a_tuple ):
a,b = a_tuple
a_dict[a] = b
return a_dict
我想到的两种方式如下:
class MyDict(dict):
def my_method(self, a_tuple):
return my_func(self, a_tuple)
或:
import functools
class MyOtherDict(dict):
def __init__(self):
self.my_parital = functools.partial(my_func, self)
有人指出,以下内容也适用。这似乎是最简单的!
class MySimpleDict(dict):
my_method = my_function
问题的轻微扩展:
通常这样做(从方法调用函数)?
答案 0 :(得分:3)
甚至还有第三个:
class MyThirdDict(dict):
my_method = my_func
这就像在类范围中定义函数一样 - 每次访问它都会导致调用函数__get__
,从而产生一个方法。
此外,在你的第一种方法中,我会做
class MyDict(dict):
def my_method(self, a_tuple):
return my_func(self, a_tuple)
以使行为100%相同。
从你的两种方法来看,第一种方法肯定更具可读性。
答案 1 :(得分:1)
更简单......
def my_func( a_dict, a_tuple ):
a,b = a_tuple
a_dict[a] = b
return a_dict
class MyDict(dict):
my_method = my_func
答案 2 :(得分:1)
实例方法只是一个函数,它是类的一个属性,因此以下内容将起作用:
class MyDict(dict):
my_method = my_func
例如:
>>> def my_func( a_dict, a_tuple ):
... a,b = a_tuple
... a_dict[a] = b
... return a_dict
...
>>> class MyDict(dict):
... my_method = my_func
...
>>> d = MyDict()
>>> d.my_method(('a', 'b'))
{'a': 'b'}
>>> d
{'a': 'b'}
这看起来有点令人困惑,因为self
未用作第一个参数名称,但它的工作方式相同。 MyDict
实例作为a_dict
参数传入。
答案 3 :(得分:0)
前者可能会被认为更清晰 - 在__init__
中创建“方法”有点令人讨厌(也意味着这些方法在类定义中不可见)。