LINUX.ORG.RU

История изменений

Исправление 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
>>>