LINUX.ORG.RU
Ответ на: комментарий от moscwich

>Ты сам запутался

нет

меня запутал.


нет, я пытался помочь, я не знал что ты упорот

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

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

foo.func (a, b)

  #skip
  @classmethod
  def foo(cls, a, b):
    print cls.foo
    print a
    print b

А вообще - анти-ООП фанатики ничем не лучше ООП-фанатиков. Такие же идиоты.

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

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

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

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

Далеко не всегда можно добавить метод произвольной переменной. Ты можешь только в некоторых случаях заманкипатчить готовый класс, но для non-mutable объектов (а таких в питоне много, например, численные типы) у тебя этого сделать не выйдет.

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

Работает, однако. Не ожидал, что cls пропустит.

Но, черт, я запутался, ведь это действительно не то, хотя показалось, что то...

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

Далеко не всегда можно добавить метод произвольной переменной. Ты можешь только в некоторых случаях заманкипатчить готовый класс, но для non-mutable объектов (а таких в питоне много, например, численные типы) у тебя этого сделать не выйдет.


Спасибо. Короче, ответ на вопрос сабжа: нельзя.
Интересно, а в JS можно?

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

>Работает, однако. Не ожидал, что cls пропустит.

В методы, которые есть у объекта или класса, первым аргументом автоматически передаётся либо объект (принято его называть self, но это таки договорённость), либо класс (тогда cls).

Т.е., если очень грубо представить, то a.func(1, 2) == func(a, 1, 2). А разница между методом класса и просто методом в том, что в первом случае не нужно создавать объект. Там ещё куча нюансов и особенностей, но тут тебе нужен учебник.

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

>Питонисты поржут, но... :)

Брутальный подход.

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

Ну и не работает нифига:

<script type="text/javascript">

function func (a, b){
	document.write (this+" "+a+" "+b);
}

function test (){
	a = 1;
	b = 2;
	obj = 'test';
	obj.func (a, b);
}

</script>


<button onClick="test();">test</button>

'obj.func' is not a function
moscwich
() автор топика
Ответ на: комментарий от moscwich

вот так работает:

<script type="text/javascript">

function func (a, b){
        document.write(this.s+" "+a+" "+b);
}

function test (){
        a = 1;
        b = 2;
        //obj = 'test';
        obj = {'s': 'test'};
        obj.func = func;
        obj.func (a, b);
}

</script>


<button onClick="test();">test</button>
hatefu1_dead
()
Ответ на: Велосипеды от anonymous

> class Bicycle:

def __init__(self):

self.function = function



у меня внутри всё замерло от этого приема

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

телепатия: он хочет питон с прототипами. Тогда можно будет как в js+php.

тред не читал)

stevejobs ★★★★☆
()

> на примере JS

function.apply(object, a, b...)

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

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

почему сразу к инстансам, а не классам?

korvin_ ★★★★★
()
var s = {
    bar : "bar"
};

var foo = function() {
  console.log(this.bar);  
};

foo.apply(s);

=> bar

this - то что тебе надо, но поскольку в js this указывает на контекст в момент вызова, надо этот контекст передать с помощью call или apply.

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

Я вижу. Пример от hatefu1_dead - яснее, понятнее, привычнее, интуитивнее... А это главное, ибо это и есть цель сабжа.

1. Делать переменную из функции - некрасиво
2. По сабжу функция должна быть как метод от переменной - в твоем примере не так, а сабж и в этом тоже. В твоем примере все сложно.

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

можно не делать переменную из функции, так тоже работает:

<script type="text/javascript">

function func (a, b){
        document.write(this.s+" "+a+" "+b);
}

function test (){
        a = 1;
        b = 2;
        obj = {'s': 'test'};
        func.apply(obj, [a, b]);
}

</script>


<button onClick="test();">test</button>
hatefu1_dead
()
Ответ на: комментарий от hatefu1_dead

Это я так сказал, замечание... Просто это лишние, бессмысленное и ухудшающие читаемость 6 символов.
Но и func.apply(obj, [a, b]) по сравнению с obj.func (a, b) некрасиво и ухудшает понимание.

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

В равноценном коде:

var s = { 
  bar : 'bar' 
};

var foo = function() {
  console.log(this.s);
};

var s.foo = foo;

s.foo();
ровно на одну меньше с apply, это не играет роли, «независимость» от имени метода даёт зависимость от имени объекта, т.е. те же яйца, вид сбоку.

Интересовало что-то посущественнее.

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

Это я так сказал, замечание... Просто это лишние, бессмысленное и ухудшающие читаемость 6 символов. Но и func.apply(obj, [a, b]) по сравнению с obj.func (a, b) некрасиво и ухудшает понимание.

Советую немного изучить предмет, чтобы не нести ересь.

func.apply(object) это не бессмысленное ухудшение читаемости кода, а наоборот, но чтобы понимать это, надо не быть дурачком уверенным, что js это простой язык для новичков.

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

А читаемость - там где используется apply / call там сразу понятен контекст, вариант же оппонента скорее можно сказать необычным.

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

Делать переменную из функции - некрасиво

Я уверен, что про то, что всё, что не var - попадает в глобальный контекст засирая его, и поэтому, зачем обильно раскидывают вары - ты вообще не в курсе.

То, что я написал отличается от написанного hatefu1_dead не формой записи функции, я с таким же успехом мог глобальную функцию сделать написав её привычным для тебя способом. Суть различия в вызове функции в контексте объекта vs создание свойства в объекте.

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

> Я уверен, что про то, что всё, что не var - попадает в глобальный контекст засирая его

И что с того, мне от того холодно или горячо?
Функция - вещь серьезная, она достойна и глобального контекста.
Для меня var нужен, чтоб переменную объявить, традиционно.

JavaScript имеет свои особенности и свои идиомы, понятие контекста вызова одна из таких особенностей.


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

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

Суть различия в вызове функции в контексте объекта vs создание свойства в объекте.


Оно не свойство, а метод.

ЗЫ. hatefu1_dead не предлагал ничего, он лишь меня поправил.

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

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

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

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

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

посему, вынесение промежуточных результатов в отдельные переменные - читаемость только улучшает ящетаю.

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

Если узнаю, что как-то иначе будет выполнятся в разы быстрее и/или займет в разы меньше памяти - буду писать так иначе.

ну вот, Reaper и объяснил, что «всё, что не var - попадает в глобальный контекст засирая его».

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

> ну вот, Reaper и объяснил, что «всё, что не var - попадает в глобальный контекст засирая его».

И как это относится к скорости выполнения и занимаемому объему памяти?

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

> CoffeeScript

Молодцы, гуд.
Но JS и так годный, я думаю:

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

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

> А без класса не как (ну, на главном уровне)? И с аргументами как быть?

Уууу, вы хоть свой собственный вопрос перечитайте. Всё, что вам нужно - это именно ООП. Вы же с объектами работаете.

К самому объекту в теле функции(метода) можно обращаться, емнип, по ключевому слову self (питон только начал изучать).

Читайте любую книжку по ООП.

Ой, классы... Я не использую классы ;)

segmentation fault. /0

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

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

И что с того, мне от того холодно или горячо? Функция - вещь серьезная, она достойна и глобального контекста.

Да мне безразлично, как оно тебе. Сидеть писать о том, что ты пишешь быдлокод и не понимаешь, как он работает и при этом пытаться поправлять то, что тебе пишут, это надо совсем упороться. Зачем ты пришёл-то сюда?

Написать о том, что ты люто бешено ненавидишь ООП и при этом не понимать 3/4 треда? Написал, молодец — рассказал всем том, что ты мартышка, которая не знает нихера вообще, но начиталась ЛОРовского фольклёра.

На JS можно писать как душе угодно, как и на питоне.

Ну, тебе-то откуда об этом знать, ты же нихуя не соображаешь ни в питоне ни в js.

Оно не свойство, а метод.

Запомни, в js объект является коллекцией свойств одного из трёх типов:

  • named data property содержащее набор boolean атрибутов;
  • named accessor property связывающее имя с одной или двумя функциями доступа и содержащее набор boolean атрибутов;
  • internal property не имеющее имени и недоступное через операторы языка, существующее исключительно для уточнения спецификации.

Это конечно, не отменяет того факта, что функции называют ещё и методами, но поскольку ты упоротый и не понимаешь не только то, что тебе говорят, но ещё и то, что пишешь сам, то лучше сиди молча и не позорься. Методы тоже являются свойствами в объектах.

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

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

> Уууу, вы хоть свой собственный вопрос перечитайте. Всё, что вам нужно - это именно ООП. Вы же с объектами работаете.

Уууу, в какой же парадигме программирования работают не с объектами?

ООП - это вид структурного программирования, из видов структурного программирования в нем в большей мере идет ориентация на объекты.

Я, конечно, могу и ошибаться. Говорю по википедии, как я понимаю, что там писано.

А я пишу в императивном стиле, как правило, и реже - в функциональном. В треде об этом есть речь.

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

Я не упертый, я любознательный. Сказал - не вижу повода мне так и сяк делать - так тыкните на него, блин, тогда. Я не могу делать так и сяк потому что ты или кто-то еще особо умный мне так сказали, я должен понять сначала какой профит я от того получу, пока я профита не вижу - имею право полагать, что его нет.

Ты неадекватно воспринимаешь обсуждения, давай нормально или ПНХ.

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

я в жс настолько не разбираюсь.

например, в эрланге все функции - это атомы. А размер таблицы с атомами ограничен. Если у тебя достаточно много функций, они могут не влезть в объем таблицы и вм выпадет с out of memory.

что-то такое, имхо, должно быть и у жс. У ноды, кстати, объем памяти сильно ограничен, что-то около 1.7 Gb на инстанс.

а вот, например, цитата с мозилловского сайта:

https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope

Closures can use up a lot of memory. The memory can be freed only when the returned inside is no longer accessible... Because of this inefficiency, avoid closures whenever possible, i.e. avoid nesting functions whenever possible.

но подобные предостережения относятся только к людям без мозга :) (особенно если они пользуются мозилловским поделием)

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

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

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

Плюс ты огребешь странных ошибок. По типу, если использовать жаву для скриптов, то скрипты будут динамически генерить классы. И тут полезно помнить, что вплоть до Java 7 класслоадер не освобождал память от неиспользованных описаний классов. Чтобы освободить эту память, нужно было перезапустить всю вм целиком, никаких других путей. В багтрекере Жавы по этому поводу дофига воплей от всевозможных скриптовальщиков, и все они до последнего времени посылались нафиг с WONTFIX, потому что _так_ эту технологию использовать не нужно.

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

> Если у тебя достаточно много функций

over9000?
Ограничения не зря сделаны. Вот бывает же - память кончается, повисает все нахрен.

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

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

Делать ты можешь как хочешь, но не надо спорить о том, в чём ты не разбираешься. Нет у тебя никакого права на споры пока ты не владеешь хотя бы на уровне уверенности для себя самого в том, что ты знаешь предмет спора. Сам же пишешь, что язык не знаешь.

Спорить не надо в первую очередь для себя самого. Если ты не владеешь предметом и не слушаешь, а споришь, то писать тебе что-то бесполезно.

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

а вот, например, цитата с мозилловского сайта:

А если добавить, что функций не являющимися замыканиями в js нет, то у ТС случится разрыв мозга. Он же не полезет проверять и не обнаружит, что цитата про замыкания, которую ты привёл, в тексте по ссылке не находится - ты про эрланг процитировал? Поэтому не надо такое ему постить, он уже ООП изучил по википедии.

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

>Я не упертый, я любознательный.

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

Будь проще.

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

например, есть какой-то алгоритм, записанный на собственном язычке, который конпелируется в жаваскрипт. В этом алгоритме/язычке удобно обращаться к числам как к объектам:

1.inv() == -1

В жаваскрипт, допустим, каждое объявление конпелируется в функции вида:

function num_get_1() {...}

И это хорошо, когда в алгоритме используется всего несколько чисел. Типа,

int x = $1
int y = $2
echo 2.mult(x.inv())

Потом приходит другой чувак, и сочиняет нечто вроде:

for (i=1; i<9002;i++) {
    buffer.add(2.mult(i.inv()));
}

Это всё еще работает. Оно сгенерит 9001 функцию num_get_1 ... num_get_9001, ну да и фиг с ним, зато удобно, числа как объекты, всё такое.

Но потом приходит какой-то новый кодер, и по образу и подобию, будучи не в курсе реализации происходящего, колбасит нечто вроде:

for (i=100500; i<0.intMax();i++) {
    buffer.add(i.integral(i.inv()));
}

Такой код вполне себе соберется, но нифига не запустится по понятной причине.

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

Я не спорю, я ищу профит, пока я его не вижу - полагаю, что его нет (имею право).
Хотя может быть это и называется спором, но в споре рождается истина, в споре я либо нахожу профит, либо не нахожу его и выясняю, что особо умный, заявлявший что он [профит] есть, оказался самозванцем или просто был не прав (ну, иногда еще, как вариант, оказался мyд-м, если не стал показывать профит и не признал сам, что не прав).

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