Более быстрый доступ к атрибутам в PythonPython

Программы на Python
Anonymous
Более быстрый доступ к атрибутам в Python

Сообщение Anonymous »

Рассмотрим следующий класс:

Код: Выделить всё

class MyObject(object):

__slots__ = ('_att1', '_att2')

def __init__(self):
self._att1 = None
self._att2 = None

@property
def att1(self):
"""READ-ONLY property. """
return self._att1

@property
def att2(self):
"""att2 property description. """
return self._att2

@att2.setter
def att2(self, val):
self._att2 = val
Преимущество использования декоратора свойств заключается в том, что мы можем добавить некоторую документацию

Код: Выделить всё

a = MyObject()
help(a)
Help on MyObject in module __main__ object:

class MyObject(__builtin__.object)
|  Methods defined here:
|
|  __init__(self)
|
|  ----------------------------------------------------------------------
|  Data descriptors defined here:
|
|  att1
|      READ-ONLY property.
|
|  att2
|      att2 property description.
Если класс предназначен для использования конечным пользователем, то можно получить доступ к атрибутам
с помощью свойств.

Код: Выделить всё

a.att2 = "new value"
Однако, если бы мне пришлось создать класс из MyObject, допустимо ли использовать «защищенные» переменные в производном классе? То есть

Код: Выделить всё

 class Derived(MyObject):

__slots__ = ()

def __init__(self):
self._att1 = 1
self._att2 = 0

@property
def att2(self):
"""att2 adds 1 to itself in every call. """
self._att2 += 1
return self._att2

@att2.setter
def att2(self, val):
self._att2 = val
Я знаю, что если бы MyObject был объектом третьей стороны, то атрибуты с подчеркиванием могут быть изменены, и поэтому мой код сломается, если они когда-либо изменятся. Однако, поскольку я использую MyObject в качестве базового класса, я думаю, что его можно использовать с моими собственными производными классами.
Недавно я начал использовать Pylint, и это сделало мне известно, что я использую «защищенные» переменные в своих производных классах. Причина, по которой я решил опубликовать здесь вопрос, состоит в том, чтобы узнать, приемлемо ли это, чтобы я мог просто подавить эти предупреждения в Pylint. Если это не так, то каковы стандарты для решения этой проблемы?
Еще один момент, который я хотел бы отметить, касается доступа к атрибутам. Что будет быстрее или

Код: Выделить всё

a._att1
У меня сложилось впечатление, что при выполнении a.att1 Python сначала просматривает словарь объектов или слоты, как в примере, с которым я работаю. Если его там нет при поиске функций (как в случае с __getattr__). Выполняя много вычислений в определении своего класса, я предпочитаю обращаться к чему-то, расположенному в словаре или в слотах, а не к тем, которые я определил с помощью декораторов. Считается ли это плохой практикой среди сообщества Python? Я спрашиваю об этом только потому, что конфигурация Pylint по умолчанию говорит мне об обратном, и я хотел бы продолжать работать, помня о хороших стандартах.
Это не обсуждение __slots__< /code> и преждевременная оптимизация. Если возможно, предположим, что в исходном посте я не использовал __slots__ и что всё есть в словаре объекта.

Подробнее здесь: https://stackoverflow.com/questions/168 ... -in-python

Вернуться в «Python»