2017-01-26 4 views
1

У меня есть класс с некоторыми атрибутами. Я хочу использовать методы. Каков самый питонический способ его использования? Есть ли документация, которую я могу прочитать об этих проблемах стилей ?. Я использую pylint и pep8 исправить такого рода проблемы, но эти программы не показывают какие-либо ошибок в данном примере с атрибутомСтиль Python с атрибутами в определении класса

class A(object): 
     BLOCK_SIZE = 8192 

     def func1(self): 
       print self.BLOCK_SIZE 
     def func2(self): 
       print A.BLOCK_SIZE 

Если я правильно понимаю, это два случая одинаковы, но я не знать, лучше ли ссылаться на имя класса или использовать самостоятельную ссылку.

Благодаря

ответ

3

Вы должны предпочесть self.

Существует два типа полей - переменные класса и переменные объекта.

Переменные класса разделяются в том смысле, что к ним обращаются все объекты (экземпляры) этого класса. Существует только копия переменной класса, и когда какой-либо один объект делает изменение переменной класса, это изменение отражается и во всех других экземплярах.

Переменные объекта принадлежат каждому отдельному объекту/экземпляру класса. В этом случае каждый объект имеет свою собственную копию поля, то есть они не являются общими и никоим образом не связаны с полем с тем же именем в другом экземпляре того же класса.

Используя A.BLOCK_SIZE - вы получаете переменную класса, а используя self.BLOCK_SIZE, вы получаете атрибут определенного объекта.

Проверьте это, чтобы получить подробный пример и пояснения. https://www.ibiblio.org/g2swap/byteofpython/read/class-and-object-vars.html

+0

Кроме того, все ВЕРХНЕЙ ЧАСТИ следует использовать только для глобальных констант, не так ли? – MKesper

+0

Я не помню ничего подобного в PEP8, но в соответствии с руководством по стилю Django можно использовать переменные UPPERCASE внутри класса. –

+0

Также в соответствии с соглашениями об именовании глобальной переменной PEP8 те же, что и для функций. https://www.python.org/dev/peps/pep-0008/#global-variable-names –

1

Атрибут класса более или менее может использоваться как значение по умолчанию для атрибута экземпляра. Язык позволяет атрибуту класса считываться либо из самого класса, либо из любого экземпляра класса, если экземпляр не имеет атрибута с тем же именем.

Но все будет по-другому для доступа на запись: A.BLOCK_SIZE=16384 изменит атрибут глобального класса, а self.BLOCK_SIZE=16384 создаст (или обновит) атрибут экземпляра с тем же именем.

Вот небольшой пример с классом:

>>> a = A() 
>>> a.func1()    # access the class attribute 
8192 
>>> a.func2()    # access the class attribute too 
8192 
>>> a.BLOCK_SIZE=4096  # create an instance attribute of same name 
>>> a.func1()    # access the INSTANCE attribute 
4096 
>>> a.func2()    # still access the class attribute 
8192 

Вот причина, почему вы должны под общие circonstances использовать экземпляр семантику (self.BLOCK_SIZE), поскольку он не зависит от имени класса и позволяет за экземпляр переопределение ,

Семантика класса A.BLOCK_SIZE должна использоваться только в том случае, если вы хотите изменить атрибут класса или использовать атрибут класса, даже если атрибут экземпляра существует.

Смежные вопросы