为什么 fromkeys 是方法而不是内置函数?

Why is fromkeys a method rather than a built-in function?

提问人:Balu 提问时间:3/28/2022 最后编辑:Balu 更新时间:3/28/2022 访问量:134

问:

为什么类的方法是类的方法,而不是独立的内置函数?fromkeysdict

据我所知,它仅根据传递给方法的参数返回一个新字典,并且不受从中调用它的类实例(字典)的影响。通常的实现只是直接使用类名,而不是首先指定类实例。dict

我尝试了以下语句,但它们都始终忽略了我提到的类实例。


>>> dict.fromkeys((1,2))

{1: None, 2: None}

>>> {1: "Hey"}.fromkeys((1,2))

{1: None, 2: None}

>>> {1: "Hey"}.fromkeys((2,))

{2: None}

Python 文档也没有提到参数的作用。它没有提到类实例的任何用途,但也没有声明它的无目的性。

我相信原因可能与命名空间管理有关。用户创建的函数不会以这种方式影响内置类方法,对吧?fromkeys

我只是想确保我没有错过类实例可能具有的任何目的,以避免将来在我的代码中出现错误

Python 函数 字典 方法 命名空间

评论

0赞 DeepSpace 3/28/2022
为什么它会是一个独立的功能?成像读取具有 . 行的代码它有什么作用? 什么?fromkeys((1, 2))fromkeys
0赞 DeepSpace 3/28/2022
此外,在许多 OOP 语言中是一个非常流行的成语type.alternative_way_to_build_type(args)
0赞 Balu 3/28/2022
@DeepSpace 如果它是一个独立的函数,它不一定需要带有相同的名称。例如,它可以被命名。我们还可以考虑修改实现以相应地适应它。但感谢您提到这是一件很受欢迎的事情。到目前为止,我只学习了 Python,并且只在字典中看到了这一点dict_fromkeys

答:

1赞 chepner 3/28/2022 #1

的结果仅依赖于自身和传递给函数的参数。它不使用存储在现有实例中的任何信息,因此没有理由提供信息。dict.from_keysdict

至于为什么它不是一个函数,仍然可以为子类工作,而不必做任何不同的事情。dict.from_keysdict

>>> from collections import OrderedDict
>>> type(OrderedDict.fromkeys([1,2,3]))
<class 'collections.OrderedDict'>

Counter.fromkeys行不通,但那是因为被专门覆盖以建议替代方案。Counter.fromkeys


粗略地说,你可以认为是这样实现的:dict.fromkeys

@classmethod
def fromkeys(cls, keys, value=None):
    return cls((k, value) for k in keys)

像这样的电话

{'a': 1}.fromkeys(['b'])

相当于

dict.fromkeys(dict, ['b'])  # First argument is type({'a': 1}), not dict

评论

0赞 Balu 3/28/2022
所以澄清一下,我们从哪个字典中调用该方法并不重要,对吧?
0赞 chepner 3/28/2022
右。 使用其第一个参数来决定要实例化的内容,而不是严格地创建一个 .由类的实例调用的类方法仍接收类,而不是实例作为其第一个参数。dict.fromkeysdict
0赞 Balu 3/28/2022
你是在暗示还有其他类有 fromkeys 方法吗?
0赞 chepner 3/28/2022
我不否认。但不必定义自己的方法即可返回 . 在类定义,但它不是特定于 的。OrderedDictfromkeysdict.fromkeysOrderedDictfromkeysdictdict