2015-02-08 2 views
1

Я довольно новичок в Python oop. Таким образом, этот класс:методы класса python: параметр как переменные класса плюсы и минусы

class Foo: 
    def barfunc(self, baz): 
     print baz 

смотрит на меня очень похожа на

class Foo: 
    def barfunc(self, baz): 
     self.baz = baz    
     print self.baz 

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

+0

У вас есть несколько синтаксических ошибок ... (объявление класса не заканчивается '()', если вы не унаследовав от чего-то .. то есть ' Foo (object): '. Объявление функции должно заканчиваться на': '...). Кроме того, имя класса должно начинаться с случая с капиталом. – alfasin

+0

Вы прошли через раздел [Классы учебника] (https://docs.python.org/2.7/tutorial/classes.html#classes)? – wwii

+0

@ alfasin: ty, да, я опрокинул его слишком быстро. Надеюсь, этот вопрос все еще проявляется. – jose

ответ

2

Если вы хотите просто напечатать baz один раз, то оба они эквивалентны.

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

class Foo(object): 
    def barfunc(self, baz): 
     self.baz = baz    
     print self.baz 

    def barbar(self): 
     print self.baz 

И теперь вы можете сделать

>>> f = Foo() 
>>> f.barfunc(10) 
10 
>>> f.barbar() 
10 
+0

Отлично, спасибо. Только то, что я хотел знать. – jose

+0

Ой, извините, но для записи в вашем примере кода есть небольшая ошибка, это должно быть: >>> f = Foo() >>> f.barfunc (10) >>> f.barbar() – jose

+1

@jose Спасибо, что указали это, внесите изменения. –

2

Одним из основной ловушки вашей терминологии - ни пример показывает класс переменная.

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

Во втором примере baz является аргументом метода экземпляра и присваивается атрибуту экземпляра self.baz внутри этого метода. После вызова метода self.baz будет доступен для всех объектов экземпляра класса.

+1

ty, да, я знаю, что я действительно сосать на этом. Я полностью ошеломлен терминологией, но одно замечательное улучшение по сравнению только вчера - это то, что я действительно понял ваш пост ... :) – jose

+0

Я бы сказал, что есть две отдельные идеи, которые нужно изучить: 1) что ООП является стилем программирования , каковы его преимущества, как структурировать программу, используя этот стиль; и 2) как вы реализуете этот стиль программирования в Python, инструменты Python предлагают и как использовать эти инструменты. Pyvideo.org - отличный ресурс - приходит на ум [Инструмент развития класса Python] (http://pyvideo.org/video/1779/pythons-class-development-toolkit). – wwii

0

первый пример будет иметь эффект только внутри function..but второй будет иметь эффект в весь класс ..

class foo(): 
    bar=1 
    def baz(self,bar): 
     print bar 
    def baz1(self,bar): 
     self.bar=bar 
a=foo() 
a.bar 
#prints 1 
a.baz(2) 
#prints 2 
a.bar 
#here it prints 1 again because it is the class variable which is not affected by the baz() function's local variable 
a.baz1(3) 
#prints 3 
a.bar 
#here the class variable value changes to 3 because self.bar changes the value of bar in entire class 

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

запустить этот пример и спросить, если у вас есть какие-либо сомнения

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