LINUX.ORG.RU

Питон и классы


0

0

Здравствуйте. Недавно начал изучение Python, дошел до классов и не могу понять один момент. Имеется такой (например) код:

#!/usr/bin/env python

class SimpleClass:
   def show():
      print "Hello, World"

def main():
   sc = SimpleClass()
   sc.show()

main()

Почему интерпретатор выдает ошибку "TypeError: show() takes no arguments (1 given)"?

Спасибо.
anonymous

def show(self):

Так как сейчас, python видит статический метод класса (без аргументов), которому суют экземпляр класса в качестве первого аргумента.

anonymous
()
Ответ на: комментарий от anonymous

> Так как сейчас, python видит статический метод класса

show не статический метод, а обычный (unbound) метод класса, не принимающий аргументов. Чтобы был статический метод необходимо иметь new-style класс и использовать staticmethod().

Топикстартеру: Не привыкай к плохому стилю. Правильно написать твой пример так:

class SimpleClass(object): # New-style класс def show(self): # Первый аргумент метода всегда 'self' print 'Hello, World' # Оступы по 4 пробела (см. PEP8)

def main(): sc = SimpleClass() sc.show()

if __name__ == '__main__': # Общепринятый способ (см. http://docs.python.org/lib/module-main.html) main()

anonymous
()
Ответ на: комментарий от anonymous

> Так как сейчас, python видит статический метод класса

show не статический метод, а обычный (unbound) метод класса, не принимающий аргументов.
Чтобы был статический метод необходимо иметь new-style класс и использовать staticmethod().

Топикстартеру:
Не привыкай к плохому стилю. Правильно написать твой пример так:

class SimpleClass(object):  # New-style класс
    def show(self):  # Первый аргумент метода всегда 'self' 
        print 'Hello, World'  # Оступы по 4 пробела (см. PEP8)

def main():
    sc = SimpleClass()
    sc.show()

if __name__ == '__main__':  # Общепринятый способ (см. http://docs.python.org/lib/module-main.html)
    main()

anonymous
()
Ответ на: комментарий от anonymous

Теперь все стало понятно. Благодарю за помощь и рекомендации по стилю :)

// Топикстартер

anonymous
()
Ответ на: комментарий от anonymous

(топикстартеру это читать уже не обязательно ;)

> show не статический метод, а обычный (unbound) метод класса

Нууу, в python'овской терминологии строго говоря да, но за пределами python'а это обычно полные синонимы, да и для python'а, imho, разница весьма третьестепенная.

anonymous
()
Ответ на: комментарий от anonymous

Терминология тут ни при чем. Unbound и Static методы абсолютно разные вещи.


class MyClass(object):
    def func_a(self):  # Unbound
        pass

    def func_b():  # Тоже unbound, но не принимает аргументов
        pass

    @staticmethod
    def func_c():  # Static, только для new-style классов
        pass

    @classmethod
    def func_d(cls):  # Class, только для new-style классов
        pass

my_class = MyClass()

MyClass.func_a()  # TypeError - при вызове через класс unbound методу требуется передать экземпляр
MyClass.func_a(my_class)  # Правильный вызов unbound метода

MyClass.func_b()  # TypeError - при вызове через класс unbound методу требуется передать экземпляр
MyClass.func_b(my_class)  # TypeError - метод не принимает аргументов

MyClass.func_c()  # Нормальный static метод

my_class.func_a()  # Bound метод, self первым аргументом передастся неявно
my_class.func_b()  # TypeError - bound метод, self передается неявно, но метод не принимает аргументов
my_class.func_c()  # Нормальный static метод


С class методами разберитесь сами в качестве домашнего задания.

anonymous
()
Ответ на: комментарий от anonymous

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

def func_b(): - какой смысл вот в этом, если его все равно нельзя вызвать? Или он внутри класса может использоваться?

anonymous
()
Ответ на: комментарий от anonymous

а ты сначала изучи его а потом уже говори. В отличие от других языков тут всё в PEP задокументированно. Если что-то ввели значит это так нужно и об этом можно прочитать в документации.

anonymous
()
Ответ на: комментарий от anonymous

> а ты сначала изучи его а потом уже говори. В отличие от других языков тут всё в PEP задокументированно. Если что-то ввели значит это так нужно и об этом можно прочитать в документации.

Хе-хе. Заметь, ты написал "Если что-то ввели значит это так нужно". Если к языку что-то добавляют как непришей кобыле хвост, это значит, что пытаются заткнуть какой-то просчет в изначальной задумке. И учитывая сколько таких костыликов, видно что язык писался под пиво.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.