LINUX.ORG.RU

Python: Если ты объявляешь метод в классе с декоратором @classmethod - первым аргументом он получает объект класса (а не объект инстанса класса). Тебе это нужно?

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

Ой, классы... Я не использую классы ;)
У меня с ООП все очень плохо, да. Из твоего поста ничего не понял.

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

Ну, ты делаешь класс:

class Ololo(object):
  foo = "lor rulezz"
  @classmethod
  def foo(cls):
    print cls.foo
[[/code]]
И после этого можешь писать Ololo.foo(), он будет печатать то, что в классовой переменной foo

enchantner
()

Велосипеды

>Собственно, можно ли сделать так - вызывать функцию как метод?

можно.
предположем у нас есть функция:

def function(a, b):
    return b, a

и

некий класс:

class Bicycle:
    def __init__(self):
        self.function = function

и получаем то, что ты хочешь:

>>> bicycle = Bicycle()
>>> bicycle.function(1,2)
(2, 1)

anonymous
()

Как ты хочешь:

class Foo(object): pass

def func(self):
    print self.foo

foo = Foo()
foo.foo = "I'm foo"
foo.func = func.__get__(foo)

foo.func()

Но, уверен, это не то что тебе нужно.

baverman ★★★
()
Ответ на: комментарий от shty

> ну так срочно беги подтягивай, чего сидишь

Ну и еще я его [ООП] люто, бешено ненавижу. Предпочитаю процедурное и функциональное программирование.

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

ужс

Что поделать, именно так получаются bound-methods. И такое нужно в *крайне редких* случаях.

Опиши задачу полностью.

baverman ★★★
()
Ответ на: комментарий от moscwich

1. тогда ты выбрал не тот язык
2. но за что не скажешь, конечно?
3. это ущербный по своей сути подход

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

Python не я выбрал, его выбрало большинство.
Был бы выбор - писал бы на PHP или на бейсике/паскале. На веб пишу на PHP.
И вообще-то Python и императивный и функциональный язык тоже, читать вики. Даже примеры сравнения на нем приводят. Пока несколько прог осилил на нем без классов.

moscwich
() автор топика
Ответ на: комментарий от baverman

> Опиши задачу полностью.

Нужно из пользовательской функции func, запускаемой с различными параметрами (аргументами), как метод от переменной obj, получить переменную obj.

Цель одна - логичность (читаемость) кода.

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

Был бы выбор - писал бы на PHP или на бейсике/паскале. На веб пишу на PHP.

/me с криком убежал, дико вращая глазами

Цель одна - логичность (читаемость) кода.

Хочешь логичности - юзай ООП. Не хочешь - тогда и не говори про читаемость и логичность.

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

Цель одна - логичность

А добавлять методы к инстансам на лету это логично? Если не рассматривать прототипные языки, конечно.

как метод от переменной obj

Если нужен метод, добавь его определение в класс. Что мешает?

baverman ★★★
()
Ответ на: комментарий от enchantner

Хочешь логичности - юзай ООП

Парадигмы и логичность — понятия ортогональные. Просто питон не приспособлен для прототипного программирования. Зато в js только так и можно реализовать поведение.

baverman ★★★
()
Ответ на: комментарий от enchantner

Ты, блин, ответишь, как быть с аргументами, когда в твоем примере вместо них не указываемый при запуске параметр?

class Ololo(object):
  foo = "lor rulezz"
  @classmethod
  def foo(cls):
    print cls.foo

А мне надо еще аргументы передать т. е.:

foo.func (a, b)

moscwich
() автор топика
Ответ на: комментарий от baverman

Классы не юзаю.
Ну если с классами, как enchantner показал, ладно, но как, тогда, черт возьми, быть с аргументами? (см. пост выше)

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

Гм. Мне кажется, тебе стоит пройти питоновский туториал, 9-ый раздел.

На код enchantner можешь тоже не обращать внимания. Он тебе без надобности.

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

Нет, у меня процедурное программирование прежде всего, и функциональное еще, а не прототипное.
И как выше сказал, питон для него приспособлен, хотя, видимо, не абсолютно.

moscwich
() автор топика
Ответ на: комментарий от baverman

На код enchantner можешь тоже не обращать внимания. Он тебе без надобности.

А как тогда? Дай пример, пожалуйста.

Ну что вы все с туториалом то пристали, ну не все же так инглиш знают... А он там сильный по инглишу (т. е. сложный).

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

Python не я выбрал, его выбрало большинство.

ты выбрал это большинство, и присоединился к его мнению, соответственно ты выбрал и язык

И вообще-то Python и императивный и функциональный язык тоже

нифига подобного, он __позволяет__ писать в императивном и функциональном стиле, но это ООП-язык, так что можешь на радостях сделать бочку, как томми

Пока несколько прог осилил на нем без классов.

лучше иди в эффективные менеджеры сразу

shty ★★★★★
()
Ответ на: комментарий от baverman

>> и получаем то, что ты хочешь:

>Нет. Он в функции хочет ссылку на объект.

4.2 на твой нет.

что мешает функции явно передать ссылку на объект?

def function(obj, a, b):
    return obj.foo + a + b

class Bicycle:
    def __init__(self):
        self.function = function

bicycle = Bicycle()
bicycle.foo = 5
bicycle.function(bicycle, 1, 2)
anonymous
()
Ответ на: комментарий от baverman

Так и делаю пока.
Но когда объект по отношению к сути функции - не объект, а субъект - это не красиво (не так логично, как...)

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

Дай пример, пожалуйста.

Пример чего? Я могу сказать чего ты не должен хотеть, чего ты хочешь только с либастралом или с телепатом, но он в отпуске.

Давай код на идеальном языке (который решает твою проблему).

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

я конечно понимаю что через одно место сделано, кстати как и твой вариант, но ТС нормально же не хочет

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

> нифига подобного, он __позволяет__ писать в императивном и функциональном стиле

Ну тогда я и буду писать в этих стилях.

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

Но когда объект по отношению к сути функции - не объект, а субъект - это не красиво

Но ты же не хочешь ООП? Или крестик сымай, или трусы надень.

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

я конечно понимаю что через одно место сделано

Не просто через одно, а непонятно зачем сделано.

кстати как и твой вариант

Что не так с моим вариантом? Явный вызов дескриптора, проблемы officer? Именно так работает интерпретатор питона, когда надо получить bound-method.

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

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

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

бладж, тогда через global

def function(a, b):
    global bicycle
    return bicycle.foo + a + b

class Bicycle:
    def __init__(self):
        self.function = function

bicycle = Bicycle()
bicycle.foo = 5
bicycle.function(1, 2)

1. PHP cъел твой мозг. 2. Реально так делать нельзя.

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

> нифига подобного, он __позволяет__ писать в императивном и функциональном стиле

Ну тогда и буду писать в этих стилях.

ну и пиши, мне то что

shty ★★★★★
()
Ответ на: комментарий от moscwich

ответ enchantner показал

Нет. Он показал *не нужный* тебе метод класса.

и вопрос главный сейчас - как тогда сделать, чтобы передавать аргументы.

А как ты передаешь аргументы в функцию?

P.S. Удаляюсь из треда, он делает мне грустно.

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

Парадигмы и логичность — понятия ортогональные.

Немножко радикальный взгляд, не находишь? :)

Ну тогда я и буду писать в этих стилях.

Глупое и бессмысленное самоограничение.

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

А как ты передаешь аргументы в функцию?

cls.func (a, b)

a, b - это аргументы, я так называю - не правильно, что-ли?

Ну не надо уходить, ну пожалуйста!

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

Так, давай заново, ещё раз и конкретнее, что тебе надо? Иметь возможность какому-то объекту без использования классов добавить метод с аргументами?

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

Ты сам запутался и меня запутал.

Повторю (переформулирую и уточню) вопрос:

Нужно из пользовательской функции func, запускаемой с различными параметрами (аргументами), как метод от произвольной переменной, получить эту переменную.

moscwich
() автор топика
Ответ на: комментарий от enchantner

Немножко радикальный взгляд, не находишь? :)

Выделять ООП как самый логичный подход к программированию — вот это радикальность.

Более того, что значит «логичность»? Нельзя так говорить, максимум: привычность, обыденность, интуитивность. И то, начинающие учиться не с ООП будут смотреть на тебя с некоторым недоумением. Мамы у утят бывают сильно разные.

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