Найти - Пользователи
Полная версия: Как правильно оформлять классы?
Начало » Python для новичков » Как правильно оформлять классы?
1
AxaRu
class Person:
    presentName = ''
    firstName = '' 
    middleName = ''
    lastName = ''
    def __init__(self, name):
        self.presentName = name
        ...
        ...
        ...
    def getFirstName(self):
        return self.firstName
    def getLastName(self):
        return self.lastName
    ...
    ...

Я оформил класс, как указано на примере.
Выдклил отдельно данные, описал методы получения значения данных.
Так принято в Python, или это моветон, и нужно обращаться напрямую к значениям?
Вообще подскажите пример правильного оформления классов.
JOHN_16
AxaRu
Вам нужно уяснить отличия объекта класса от его экземпляра - для этого нужно почитать в книгах раздел про классы и ООП.
Вот для пояснения пример:
class A(object):
    value='first'
    
    def __init__(self, value='default'):
        self.value=value
        
    def get_value(self):
        return self.value
print A.value
print A().value
print A('second').value
a=A('python')
print a.__class__.value
print a.get_value()
Результат
first
default
second
first
python
И да, не моветон. Опять же потому что прием ООП. В общем вам надо про это серьезно почитать, если хотите обладать знаниями в этой области.
AxaRu
JOHN_16
Спасибо за ответ.,
Вот Вы мне мозг взорвали . До сих пор я думал, что объект класса и экземпляр класса - синонимы. В том смысле, что объект является экземпляром класса.

В вашем примере создаются 4 объекта(экземпляра) класса А
1.
print A.value
Первый объект - экземпляр класса был создан при описании класса. Можно сослаться на него по имени класса.
Как я понимаю это идеологическая “фишка” Python возникшая из-за того, что собственно Python интерпретатор.

2-3.
print A().value
print A('second').value
Два других объекта - экземпляра класса А никакой переменной не присваиваются и дальше сослаться на них будет не возможно.

4. А здесь создается объект - экземпляр а класса А
a=A('python')
print a.__class__.value
print a.get_value()

Я не прав? Или может я неверно использую терминологию?
py.user.next
Вместо функций для чтения/записи атрибута можно сделать свойство.
>>> class Person:
...     
...     _name = None
...     
...     @property
...     def name(self):
...         return self._name
...     
...     @name.setter
...     def name(self, s):
...         self._name = s
... 
>>> p = Person()
>>> p.name = 'name 1'
>>> p.name
'name 1'
>>> p.name = 'name 2'
>>> p.name
'name 2'
>>>

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

AxaRu
Так принято в Python, или это моветон, и нужно обращаться напрямую к значениям?
Не всегда класс и программу, которая его использует, разрабатывает один человек. Поэтому они, не зная друг о друге, могут менять свои коды как угодно.

Даже если сам всё разрабатываешь, код может быть таким большим, что не будет времени его читать, и, внося изменения в какой-то класс, просто не будешь знать, можно их вносить или там что-то зависит.
JOHN_16
AxaRu
не совсем, в первом случае это не объект экземпляра класса, а сам объект класса. Обратите внимание что там A, а не A().

AxaRu
это идеологическая “фишка” Python возникшая из-за того, что собственно Python интерпретатор.
Не совсем, скорее потому что все в Питоне это объект в концептуальном смысле. Класс,функция, число,строка имеет одну природу - объект.

AxaRu
Два других объекта - экземпляра класса А никакой переменной не присваиваются и дальше сослаться на них будет не возможно.
В целом да, за исключением специального объекта _ в интерактивном режиме, который хранит в себе предыдущий объект который был возвращен в консоль:
>>> class A(object): pass
...
>>> A()
<__main__.A object at 0x00F49030>
>>> print _
<__main__.A object at 0x00F49030>
>>> 'qwerty'
'qwerty'
>>> print _
qwerty

AxaRu
А здесь создается объект - экземпляр а класса А
Правильно. Но внутри экземпляра класса a есть спец аттрибут который ссылается на объект породивший экземпляр - на объект класса A
AxaRu
py.user.next
спасибо за то что указал на свойство языка (@property, @name.setter) при описании доступа к данным объекта. Я в книге у Лутца этого не видел.
JOHN_16
Спасибо за то что заставил задуматься и поразмышлять об ООП.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB