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)
本地名称要快一些,所以first,不是self.first,因为后者需要先查询本地名称self,然后再查询first该对象上的属性。与所有其他查询相比,局部变量的使用得到了高度优化。
但是,差异很小,因此专注于此是过早的优化。仅在必须在关键代码中使用相同的可变时间负载时,才担心此问题。
如果忽略性能差异,则归结为要求和明确性;实例属性的行为可能与局部变量完全不同,这可能是一个优势:
如果您需要支持想要更改分配给或访问时(使用)的方式self.first和self.last行为的子类property,则需要使用这些属性。
另一方面,使用局部参数名称可以清楚fullname地知道self.first,self.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毫秒。
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |