2014-04-03 1 views
0

Итак, у меня есть TerrainManager класс, который будет хранить несколько TerrainStructure объектов в списке. У меня есть метод, в классе TerrainStructure под названием generate_pillar_points() он используется для установки значений x, y в значениях TerrainStructure атрибутов.Должен ли я присваивать атрибутам __init__ ссылку на класс или что-то вроде None?

Должен ли я назначать атрибуты для ссылки на класс? Я думаю, что это может быть хорошим подходом просто потому, что я могу посмотреть на атрибут и посмотреть, что это будет объект Point. Или я должен установить значения по умолчанию не будет None или 0, а затем, когда я звоню generate_pillar_points() установить эти атрибуты, чтобы быть экземпляром Point класса

Я задаю этот вопрос с этим в виду:

a = Cls # reference to Cls

a = Cls() # instance of Cls

Вот код, я уверен, что это будет понятнее, что я хочу спросить.

class Point(object): 
    def __init__(self, x, y): 
     self.x, self.y = x, y 

class TerrainStructure(object): 
    def __init__(self): 
     # what default values should this points have? 
     self.top_left, self.top_right = Point, Point 
     self.bottom_left, self.bottom_right = Point, Point 

     # picks 4 random points between fixed ranges 
     # and assigns them to the above attributes 
     self.generate_pillar_points() 
+3

Вы можете просто не устанавливать их вообще, и позволить 'generate_pillar_points' устанавливать их в первый раз. – BrenBarn

ответ

6

Установите их в None. Это единственный разумный вариант. Или ничего не присваивайте, если вы всегда вызовите метод, который присваивает им значения в вашем конструкторе.

Установка их самому классу была бы очень странной. Кроме того, это не принесло бы никакой пользы, кроме как сделать ваш код более сложным для отладки - представьте себе, что назначение в вашем методе не происходит по какой-либо причине (возможно, случайно присвоить self.c вместо self.x, потому что вы неуклюжи). Тогда вы не получите красивое исключение, показывающее, что значение None, но что-то странное или в зависимости от кода вообще не является исключением!

-1

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

+0

Это не очень pythonic. – ThiefMaster

+0

Вы можете сказать, что валидация не очень питоновая, но исходный плакат, по крайней мере, подразумевал, что он искал способ дать понять, что им должны быть назначены объекты определенного типа. Если вы хотите сделать это, то свойства и повышение TypeError - это путь. – Hans

+0

Для вещей, прошедших снаружи, конечно. Но зачем вам проверять вещи, которые вы установили в своем классе? – ThiefMaster

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