Как определить класс в Python

Довольно просто, я изучаю python, и я не могу найти ссылку, которая подскажет мне, как написать следующее:

public class Team { private String name; private String logo; private int members; public Team(){} // getters/setters } 

Позже:

 Team team = new Team(); team.setName( "Oscar" ); team.setLogo( "http://...." ); team.setMembers( 10 ); 

Это класс Команда со свойствами: имя / логотип / участники

Редактировать После нескольких попыток я получил следующее:

 class Team: pass 

Позже

 team = Team() team.name="Oscar" team.logo="http://..." team.members=10 

Это питон? Чувствует себя странным (исходя из строго типизированного языка, конечно)

  • Откройте хром-удлинитель через селен-webdriver
  • Python - программа не отображается, как предполагалось
  • Более быстрое развитие альтернативного хранилища данных App Engine
  • Могу ли я получить консольный ввод без эха в python?
  • Запуск функции python каждую секунду
  • Python: Pass или Sleep для длительных процессов?
  • Установите текущий каталог при запуске SimpleHTTPServer
  • Реализовать псевдоспектральный метод с RK4 в Python
  • 2 Solutions collect form web for “Как определить класс в Python”

     class Team: def __init__(self): self.name = None self.logo = None self.members = 0 

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

    Вот что я бы рекомендовал:

     class Team(object): def __init__(self, name=None, logo=None, members=0): self.name = name self.logo = logo self.members = members team = Team("Oscar", "http://...", 10) team2 = Team() team2.name = "Fred" team3 = Team(name="Joe", members=10) 

    Некоторые замечания по этому поводу.

    0) Я объявил, что команда наследует object . Это делает команду «классом нового стиля»; это было рекомендовано в Python, так как оно было введено в Python 2.2. (В Python 3.0 и выше классы всегда «нового стиля», даже если вы не (object) нотацию (object) , но эта нотация не наносит вреда и делает наследование явным.) Вот обсуждение StackOverflow классов нового стиля.

    1) Это не требуется, но я заставил инициализатор принять дополнительные аргументы, чтобы вы могли инициализировать экземпляр в одной строке, как это было с team и team3 . Эти аргументы называются, поэтому вы можете либо предоставить значения в качестве позиционных параметров (как в team ), либо вы можете использовать argument= форму, как в team3 . Когда вы явно укажете имя аргументов, вы можете указать аргументы в любом порядке.

    2) Если вам нужны функции getter и setter, возможно, что-то проверить, в Python вы можете объявить специальные функции метода. Это то, что имел в виду Мартин против Лёвиса, когда он сказал «дескрипторы свойств». В Python обычно считается хорошей практикой просто назначать переменные-члены и просто ссылаться на их выборку, потому что вы всегда можете добавить в дескрипторы свойств позже, если они вам понадобятся. (И если они вам никогда не понадобятся, тогда ваш код менее загроможден и у вас меньше времени на запись. Бонус!)

    Вот хорошая ссылка о дескрипторах свойств: http://adam.gomaa.us/blog/2008/aug/11/the-python-property-builtin/

    3) На самом деле не имеет значения, укажите ли значения как часть вызова Team() или, если вы сосете их в свой экземпляр класса позже. Окончательный экземпляр класса, в котором вы закончите, будет идентичным.

     team = Team("Joe", "http://example.com", 1) team2 = Team() team2.name = "Joe" team2.logo = "http://example.com" team2.members = 1 print team.__dict__ == team2.__dict__ 

    Вышеприведённый текст напечатает True . (Вы можете легко перегрузить оператор == для экземпляров Team и сделать Python правильным, когда вы говорите team == team2 но это не происходит по умолчанию.)


    EDIT: Я оставил одно в вышеупомянутом ответе, и я хотел бы добавить его сейчас. Если вы выполняете необязательную аргументацию в функции __init__() , вам нужно быть осторожным, если вы хотите предоставить «изменяемый» в качестве необязательного аргумента.

    Целые числа и строки являются «неизменными». Вы никогда не сможете изменить их на месте; вместо этого Python создает новый объект и заменяет тот, который у вас был раньше.

    Списки и словари «изменяемы». Вы можете поддерживать один и тот же объект навсегда, добавляя к нему и удаляя его.

     x = 3 # the name "x" is bound to an integer object with value 3 x += 1 # the name "x" is rebound to a different integer object with value 4 x = [] # the name "x" is bound to an empty list object x.append(1) # the 1 is appended to the same list x already had 

    Главное, что вам нужно знать: необязательные аргументы оцениваются только один раз, когда функция компилируется. Поэтому, если вы передаете переменную как необязательный аргумент в __init__() для вашего класса, то каждый экземпляр вашего класса использует один изменяемый объект. Это почти никогда не то, что вы хотите.

     class K(object): def __init__(self, lst=[]): self.lst = lst k0 = K() k1 = K() k0.lst.append(1) print k0.lst # prints "[1]" print k1.lst # also prints "[1]" k1.lst.append(2) print k0.lst # prints "[1, 2]" 

    Решение очень просто:

     class K(object): def __init__(self, lst=None): if lst is None: self.lst = [] # bind lst with a new, empty list else: self.lst = lst # bind lst with provided list k0 = K() k1 = K() k0.lst.append(1) print k0.lst # prints "[1]" print k1.lst # print "[]" 

    В этой работе используется значение аргумента по умолчанию None , а затем проверка того, что переданный аргумент is None , квалифицируется как шаблон проектирования Python или, по крайней мере, идиома, которую вы должны освоить.

    Python - лучший язык программирования в мире.