2015-09-23 11 views
0

(окончательный) EDIT: Хорошо, поэтому я полный тупик. Моя идентификация была сделана так, что все мои методы после __init__ были фактически внутри моего __init__. Это синтаксическая ошибка.Инициализировать атрибут класса с помощью метода

Я хотел бы знать, могу ли я инициализировать переменную с помощью метода (члена класса). В основном, это выглядит следующим образом:

class Tile: 
    def __init__(self, x, y, tile_type): 
     self._x = x 
     self._y = y 
     self._tile_type = tile_type 
     self._color = my_method() 

(further in class) 
    def my_method(self): 
     #my definition 

В настоящее время он дает мне ошибку:

UnboundLocalError: local variable 'my_method' referenced before assignment 

Проблема заключается в том, что я объявляю 2d массив со списком понимания, как этот

[[Tile(i,j,0) for i in range(Y_SIZE)] for j in range(X_SIZE)] 

Поэтому я хотел бы избежать второго вложенного цикла, чтобы поместить возвращаемое значение my_method() в атрибут класса _color, если это возможно.

Спасибо!

EDIT: как я уже сказал, я буду более конкретным: я хочу присвоить значение, возвращаемое my_method(), _color. И извините за отступ, my_method(self) фактически находится в классе Tile.

Для тех, кто на самом деле хотите полный код класса:

class Tile: 
    def __init__(self, x, y, tile_type): 
     self._x = x 
     self._y = y 
     self._tile_type = tile_type 
     self._color = self.set_color_variation() 

     def _get_x(self): 
      return self._x 

     def _set_x(self, x): 
      self._x = x 

     x = property(_get_x, _set_x) 

     def _get_y(self): 
      return self._y 

     def _set_y(self, y): 
      self._y = y 

     y = property(_get_y, _set_y) 

     def _get_color(self): 
      return self._color 

     def _set_color(self, color): 
      self._color = color 

     color = property(_get_color, _set_color) 

     def _get_tile_type(self): 
      return self._tile_type 

     def _set_tile_type(self,tile_type): 
      self._tile_type = tile_type 

     tile_type = property(_get_tile_type, _set_tile_type) 

     def set_color_variation(self): 
      _color = make_color(TILE_COLOR[_tile_type], TILE_COLOR_VARIATION[_tile_type]) 

и сообщение об ошибке в настоящее время он дает мне:

AttributeError: 'Tile' object has no attribute 'set_color_variation' 

Если я пишу

self._color = set_color_variation() 

It дает мне:

UnboundLocalError: local variable 'set_color_variation' referenced before assignment 
+1

В настоящее время написано, 'my_method' это на самом деле не в' Tile', хотя вы не получить к нему доступ через 'self' так или иначе; пожалуйста, дайте [mcve] полную ошибку, чтобы прояснить проблему. – jonrsharpe

+0

Вы хотите, чтобы 'self._color' был результатом вызова' my_method() ', или вы хотите, чтобы он содержал ссылку на этот метод? –

+0

Вы можете передать my_method в качестве аргумента в вашем конструкторе, как этот 'def __init __ (self, x, y, tile_type, my method)' –

ответ

1

да, вы можете, просто выполните: self._color = self.my_method в вашем конструкторе.

+1

Возможно, но я подозреваю, что OP фактически хочет значение, возвращаемое методом, то есть 'self._color = self.my_method()'. –

+0

Правильно, я, возможно, неправильно истолковал вопрос. Это имеет смысл в этом случае :) – proycon

+0

Это всегда сложно ответить на неоднозначные вопросы. Но я уверен, что OP хочет, чтобы '._color' был установлен на возвращаемое значение, из-за фразы« применить мой метод к атрибуту класса ». –

0

Вы можете попробовать это

class Tile: 
    def __init__(self, x, y, tile_type, method): 
     self._x = x 
     self._y = y 
     self._tile_type = tile_type 
     self._color = method() 

def my_method(): 
    # Write you logic here 

obj = Tile(x=1,y=2,tile_type="Type", method=my_method) 
Смежные вопросы