是否有在_init_方法中定义变量的最佳实践

Zac*_*ary 1 python coding-style python-3.x

__init__如果您使用self.var或just 构建新变量,那么在方法中定义对象变量的方式是否有充分的理由var

有关系吗?有微观速度效益吗?

就我个人而言,我更喜欢后者,因为它的文字清晰明了,文字更少。但是我经常看到两者。

class Person():
    def __init__(self, firstname, lastname):
        self.first = firstname
        self.last = lastname
        self.fullname = self.first + ' ' + self.last
Run Code Online (Sandbox Code Playgroud)

要么:

class Person():
    def __init__(self, firstname, lastname):
        self.first = firstname
        self.last = lastname
        self.fullname = firstname + ' ' + lastname
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

本地名称要快一些,所以first,不是self.first,因为后者需要先查询本地名称self,然后再查询first该对象上的属性。与所有其他查询相比,局部变量的使用得到了高度优化。

但是,差异很小,因此专注于此是过早的优化。仅在必须在关键代码中使用相同的可变时间负载时,才担心此问题。

如果忽略性能差异,则归结为要求和明确性;实例属性的行为可能与局部变量完全不同,这可能是一个优势:

  • 如果您需要支持想要更改分配给或访问时(使用)的方式self.firstself.last行为的子类property,则需要使用这些属性。

  • 另一方面,使用局部参数名称可以清楚fullname地知道self.firstself.last如果不是简单的属性,它们将与方式和行为无关。那可能是故意的。

我们在这里不能给出任何更具体的准则,因为属性可以轻松地支持本地的不同用例。

如果您确实需要担心性能,请使用该timeit模块运行微型基准测试:

>>> from timeit import timeit
>>> class PersonAttributes():
...     def __init__(self, firstname, lastname):
...         self.first = firstname
...         self.last = lastname
...         self.fullname = self.first + ' ' + self.last
...
>>> class PersonLocals():
...     def __init__(self, firstname, lastname):
...         self.first = firstname
...         self.last = lastname
...         self.fullname = firstname + ' ' + lastname
...
>>> timeit('P("Eric", "Idle")', 'from __main__ import PersonAttributes as P')
0.5858714409987442
>>> timeit('P("Eric", "Idle")', 'from __main__ import PersonLocals as P')
0.5170505980058806
Run Code Online (Sandbox Code Playgroud)

上面创建了一个实例一百万次,到那时,您将使用本地名称节省40毫秒。