2015-02-15 2 views
0

У меня есть класс с определенными атрибутами.Могу ли я использовать метод класса для установки атрибутов класса в Python?

Я хотел бы определить метод, который устанавливает другие атрибуты на основе тех, которые уже были установлены. Что-то вроде этого:

class Test: 
    def __init__(self, name): 
     self.name = name 
     self.list = [] 
     max = None 

    def get_max(self) 
     self.max = max(list) 

Это не работает. У меня такое чувство, что я делаю что-то очень плохое, но я не могу понять, что. Пожалуйста, кто-то вывел меня из моих страданий.

Обновленный код дает мне ошибку Attribute:

class Test: 
    def __init__(self, name): 
     self.name = name 
     self.lst = [] 
     self.mx = None 

    def get_max(self) 
     self.mx = max(self.lst) 

Когда я вызываю метод, никакие исключения не возвращаются, но атрибут self.mx не обновляются.

>>>t = Test('testname') 
>>>t.lst = [1,2,3] 
>>>t.get_max 
>>>t.name 
'testname' 
>>>t.lst 
[1,2,3] 
>>>t.mx 
AttributeError: Test instance has no attribute 'mx' 
+0

и 'max' приведет к ошибке, даже с' self.list' – vaultah

+0

Когда ты «Это не работает», что вы имеете в виду? Если вы получаете исключение, включите в свой вопрос полный ответ. – Blckknght

+0

Извинения за небрежно написанный код в оригинальном вопросе. Надеюсь, отредактированный вопрос немного облегчит то, что я хочу сделать. – lac

ответ

3

Было бы self.list обратиться к атрибуту, list имеет в виду питона список встроенных.

Вы должны были бы сделать что-то вроде:

class Test: 
    def __init__(self, name,lst): 
     self.name = name 
     self.lst = lst 
     self.mx = None # use self to create an attribute 

    def get_max(self): 
     self.mx = max(self.lst) 

Вы также можете просто просто позвонить максимум по списку всякий раз, когда вы хотите, чтобы получить max, вам не нужно, чтобы создать атрибут и метод просто вернуть или получить максимальный список.

Вы должны просто вернуть максимум списка в методе, если вы действительно хотите использовать метод, чтобы получить максимальную:

class Test: 
    def __init__(self, name, lst): 
     self.name = name 
     self.lst = lst 

    def get_max(self): 
     return max(self.lst) 

t = Test("foo", [1,2,3,4]) 
print(t.get_max()) 

4 

Дизайн вашего класса действительно зависит от того, что именно вы хотите сделать в нем, но вы не получаете или не устанавливаете в python.

Если вы хотите сделать что-то на основе максимального элемента в списке, вам не нужно атрибут:

class Test: 
    def __init__(self, name,lst): 
     self.name = name 
     self.lst = lst 

    def some_meth(self): 
     if max(self.lst) > 2: 
      # do something 
+0

uhm, max не затенен :), если max был параметром, объявленным локально, тогда да, он будет теневым max :) Возможно, я ошибаюсь, но слишком ленив, чтобы начать свою IDE;) – ACimander

+0

@ Оди, да, но если бы они использовали его где-нибудь в методе init, это было бы проблемой. В любом случае затенение встроенных имен никогда не является хорошей идеей –

+0

Извинения за ненадежный письменный код. Я сделал редактирование, которое, мы надеемся, немного облегчит его. Я хочу использовать метод для обновления атрибутов экземпляра – lac

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