Во-первых, вы используете классы старого стиля. Вы действительно, действительно следует использовать new style classes that inherit from object
:
class Swoosh(object):
Определение __init__
метод, который принимает аргументы, безусловно, Pythonic способ делать вещи:
def __init__(self,spam,eggs,swallow,coconut):
self.spam = spam
self.eggs = eggs
self.swallow = swallow
self.coconut = coconut
Это позволит вам сделать:
s = Swoosh('Spam!','Eggs','Swallow','Migrated')
Как и любая другая функция Python, метод __init__
может иметь defau lt для аргументов, например.
def __init__(self,spam,eggs,swallow,coconut='Migrated.'):
self.spam = spam
self.eggs = eggs
self.swallow = swallow
self.coconut = coconut
Если вы хотите проверить атрибуты они установлены, вы должны использовать стандартные property
attributes вместо того, чтобы создавать свои собственные сеттер. Если вы сделаете это так, вы можете использовать myobject.spam
в своем коде, как с обычным атрибутом, но ваш метод setter все еще запущен.
Например:
@property
def spam(self):
"""I'm the 'spam' property."""
return self._spam
@spam.setter
def spam(self, value):
if not value.endswith("!"):
raise ValueError("spam must end with !")
# Store the value in "private" _spam attribute
self._spam = value
@spam.deleter
def spam(self):
del self._spam
Примечание: property
будет не работать, если вы не используете классы нового стиля, как описано выше.
В вашем примере у вас есть:
class Swoosh():
spam = ''
eggs = ''
swallow = ''
coconut = ''
Это часто представляется как быстрый способ установки по умолчанию для атрибутов объекта. Это нормально, но вам нужно понять, что на самом деле происходит. Что происходит, так это то, что вы устанавливаете атрибуты в классе . Если у объекта нет атрибута, Python будет искать, определено ли оно в классе и возвращает значение оттуда (поскольку это то, что вы хотите для методов).
Если вы хотите установить значения по умолчанию для атрибутов объекта, вам гораздо лучше установить значения по умолчанию для аргументов в __init__
, как описано выше, вместо использования атрибутов class
.
Почему так много людей в настоящее время пишут 'class SomeThing():' если пустые parens служат ab без цели? Или это слишком тяжелая работа, чтобы вставить «объект» между ними? – pillmuncher