История изменений
Исправление user_id_68054, (текущая версия) :
А методы там тоже являются первоклассными функциями?
да. но this передаётся другим способом (чем в JS).
то есть [...] так работает?
если переписать этот пример (сточку за строчкой) в JS->Python — то результат будет 1 а не 10.
вот:
$ python
Python 3.4.2 (default, Oct 8 2014, 13:44:52)
[GCC 4.9.1 20140903 (prerelease)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> class Obj:
... def f(self):
... print(self.a)
...
>>> class Obj1:
... pass
...
>>> o = Obj()
>>> o.a = 1
>>>
>>> o1 = Obj1()
>>> o1.a = 10
>>> o1.f = o.f
>>>
>>> o.f() # результат будет 1
1
>>> o1.f() # опять 1 . так как выполнит тож же самый код (с тем же самым this как o)
1
>>>
но...
>>> # но можно сделать это:
...
>>> o2 = Obj1()
>>> o2.a = 20
>>> Obj1.f = Obj.f
>>>
>>> o2.f() # результат 20
20
>>>
то есть главное отличии здесь от JS в том что:
>>> o.f == Obj.f
False
«o.f» и «Obj.f» — это разные функции. «Obj.f» пишем мы, а «o.f» динамически создаётся метаклассом (на основе «Obj.f»).
Исправление user_id_68054, :
А методы там тоже являются первоклассными функциями?
да. но this передаётся другим способом (чем в JS).
то есть [...] так работает?
если переписать этот пример (сточку за строчкой) в JS->Python — то результат будет 1 а не 10.
вот:
$ python
Python 3.4.2 (default, Oct 8 2014, 13:44:52)
[GCC 4.9.1 20140903 (prerelease)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> class Obj:
... def f(self):
... print(self.a)
...
>>> class Obj1:
... pass
...
>>> o = Obj()
>>> o.a = 1
>>>
>>> o1 = Obj1()
>>> o1.a = 10
>>> o1.f = o.f
>>>
>>> o.f() # результат будет 1
1
>>> o1.f() # опять 1 . так как выполнит тож же самый код (с тем же самым this как o)
1
>>>
но...
>>> # но можно сделать это:
...
>>> o2 = Obj1()
>>> o2.a = 20
>>> Obj1.f = Obj.f
>>>
>>> o2.f() # результат 20
20
>>>
то есть главное отличии здесь от JS в том что:
>>> o.f == Obj.f
False
«o.f» и «Obj.f» — это разные функции. «Obj.f» пишем мы, а «o.f» создаётся в метаклассом (на основе «Obj.f»).
Исправление user_id_68054, :
А методы там тоже являются первоклассными функциями?
да. но this передаётся другим способом (чем в JS).
то есть [...] так работает?
если переписать этот пример (сточку за строчкой) в JS->Python — то результат будет 1 а не 10.
вот:
$ python
Python 3.4.2 (default, Oct 8 2014, 13:44:52)
[GCC 4.9.1 20140903 (prerelease)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> class Obj:
... def f(self):
... print(self.a)
...
>>> class Obj1:
... pass
...
>>> o = Obj()
>>> o.a = 1
>>>
>>> o1 = Obj1()
>>> o1.a = 10
>>> o1.f = o.f
>>>
>>> o.f() # результат будет 1
1
>>> o1.f() # опять 1 . так как выполнит тож же самый код (с тем же самым this как o)
1
>>>
но...
>>> # но можно сделать это:
...
>>> o2 = Obj1()
>>> o2.a = 20
>>> Obj1.f = Obj.f
>>>
>>> o2.f() # результат 20
20
>>>
то есть главное отличии здесь от JS в том что:
>>> o.f == Obj.f
False
«o.f» и «Obj.f» — это разные функции. «Obj.f» пишем мы, а «o.f» создаётся в метаклассом.
Исходная версия user_id_68054, :
А методы там тоже являются первоклассными функциями?
да. но this передаётся другим способом (чем в JS).
то есть [...] так работает?
если переписать этот пример (сточку за строчкой) в JS->Python — то результат будет 1 а не 10.
вот:
$ python
Python 3.4.2 (default, Oct 8 2014, 13:44:52)
[GCC 4.9.1 20140903 (prerelease)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> class Obj:
... def f(self):
... print(self.a)
...
>>> class Obj1:
... pass
...
>>> o = Obj()
>>> o.a = 1
>>>
>>> o1 = Obj1()
>>> o1.a = 10
>>> o1.f = o.f
>>>
>>> o.f() # результат будет 1
1
>>> o1.f() # опять 1 . так как выполнит тож же самый код (с тем же самым this как o)
1
>>>
но...
>>> # но можно сделать это:
...
>>> o2 = Obj1()
>>> o2.a = 20
>>> Obj1.f = Obj.f
>>>
>>> o2.f() # результат 20
20
>>>