Как classmethod возражает работе?

На самом деле вы можете передавать объект params в метод load ()

newsletters.load({
  params: {to: 'test1', from: 'test2'}
})
8
задан nikow 4 November 2009 в 23:46
поделиться

2 ответа

Объект classmethod является дескриптором . Вам нужно понять, как работают дескрипторы.

В двух словах, дескриптор - это объект, который имеет метод __ get __ , который принимает три аргумента: self , экземпляр и тип экземпляра .

Во время обычного поиска атрибутов если искомый объект A имеет метод __ get __ , этот метод вызывается, и то, что он возвращает, заменяется на объект A . Таким образом функции (которые также являются дескрипторами) становятся связанными методами, когда вы вызываете метод объекта.

class Foo(object):
     def bar(self, arg1, arg2):
         print arg1, arg2

foo = Foo()
# this:
foo.bar(1,2)  # prints '1 2'
# does about the same thing as this:
Foo.__dict__['bar'].__get__(foo, type(foo))(1,2)  # prints '1 2'

Объект classmethod работает точно так же. При поиске вызывается его метод __ get __ . __ get __ метода класса отбрасывает аргумент, соответствующий экземпляру (если он был), и передает только instance_type , когда он вызывает __ get __ обернутой функции.

Иллюстративный рисунок:

In [14]: def foo(cls):
   ....:     print cls
   ....:     
In [15]: classmethod(foo)
Out[15]: <classmethod object at 0x756e50>
In [16]: cm = classmethod(foo)
In [17]: cm.__get__(None, dict)
Out[17]: <bound method type.foo of <type 'dict'>>
In [18]: cm.__get__(None, dict)()
<type 'dict'>
In [19]: cm.__get__({}, dict)
Out[19]: <bound method type.foo of <type 'dict'>>
In [20]: cm.__get__({}, dict)()
<type 'dict'>
In [21]: cm.__get__("Some bogus unused string", dict)()
<type 'dict'>

Более подробную информацию о дескрипторах можно найти здесь (среди других мест): этот метод вызывается, и то, что он возвращает, подставляется вместо объекта A . Таким образом функции (которые также являются дескрипторами) становятся связанными методами, когда вы вызываете метод объекта.

class Foo(object):
     def bar(self, arg1, arg2):
         print arg1, arg2

foo = Foo()
# this:
foo.bar(1,2)  # prints '1 2'
# does about the same thing as this:
Foo.__dict__['bar'].__get__(foo, type(foo))(1,2)  # prints '1 2'

Объект classmethod работает точно так же. При поиске вызывается его метод __ get __ . __ get __ метода класса отбрасывает аргумент, соответствующий экземпляру (если он был), и передает только instance_type , когда он вызывает __ get __ обернутой функции.

Иллюстративный рисунок:

In [14]: def foo(cls):
   ....:     print cls
   ....:     
In [15]: classmethod(foo)
Out[15]: <classmethod object at 0x756e50>
In [16]: cm = classmethod(foo)
In [17]: cm.__get__(None, dict)
Out[17]: <bound method type.foo of <type 'dict'>>
In [18]: cm.__get__(None, dict)()
<type 'dict'>
In [19]: cm.__get__({}, dict)
Out[19]: <bound method type.foo of <type 'dict'>>
In [20]: cm.__get__({}, dict)()
<type 'dict'>
In [21]: cm.__get__("Some bogus unused string", dict)()
<type 'dict'>

Более подробную информацию о дескрипторах можно найти здесь (среди других мест): этот метод вызывается, и то, что он возвращает, подставляется вместо объекта A . Таким образом функции (которые также являются дескрипторами) становятся связанными методами, когда вы вызываете метод объекта.

class Foo(object):
     def bar(self, arg1, arg2):
         print arg1, arg2

foo = Foo()
# this:
foo.bar(1,2)  # prints '1 2'
# does about the same thing as this:
Foo.__dict__['bar'].__get__(foo, type(foo))(1,2)  # prints '1 2'

Объект classmethod работает точно так же. При поиске вызывается его метод __ get __ . __ get __ метода класса отбрасывает аргумент, соответствующий экземпляру (если он был), и передает только instance_type , когда он вызывает __ get __ обернутой функции.

Иллюстративный рисунок:

In [14]: def foo(cls):
   ....:     print cls
   ....:     
In [15]: classmethod(foo)
Out[15]: <classmethod object at 0x756e50>
In [16]: cm = classmethod(foo)
In [17]: cm.__get__(None, dict)
Out[17]: <bound method type.foo of <type 'dict'>>
In [18]: cm.__get__(None, dict)()
<type 'dict'>
In [19]: cm.__get__({}, dict)
Out[19]: <bound method type.foo of <type 'dict'>>
In [20]: cm.__get__({}, dict)()
<type 'dict'>
In [21]: cm.__get__("Some bogus unused string", dict)()
<type 'dict'>

Более подробную информацию о дескрипторах можно найти здесь (среди других мест): Таким образом функции (которые также являются дескрипторами) становятся связанными методами, когда вы вызываете метод объекта.

class Foo(object):
     def bar(self, arg1, arg2):
         print arg1, arg2

foo = Foo()
# this:
foo.bar(1,2)  # prints '1 2'
# does about the same thing as this:
Foo.__dict__['bar'].__get__(foo, type(foo))(1,2)  # prints '1 2'

Объект classmethod работает точно так же. При поиске вызывается его метод __ get __ . __ get __ метода класса отбрасывает аргумент, соответствующий экземпляру (если он был), и передает только instance_type , когда он вызывает __ get __ обернутой функции.

Иллюстративный рисунок:

In [14]: def foo(cls):
   ....:     print cls
   ....:     
In [15]: classmethod(foo)
Out[15]: <classmethod object at 0x756e50>
In [16]: cm = classmethod(foo)
In [17]: cm.__get__(None, dict)
Out[17]: <bound method type.foo of <type 'dict'>>
In [18]: cm.__get__(None, dict)()
<type 'dict'>
In [19]: cm.__get__({}, dict)
Out[19]: <bound method type.foo of <type 'dict'>>
In [20]: cm.__get__({}, dict)()
<type 'dict'>
In [21]: cm.__get__("Some bogus unused string", dict)()
<type 'dict'>

Более подробную информацию о дескрипторах можно найти здесь (среди других мест): Таким образом функции (которые также являются дескрипторами) становятся связанными методами, когда вы вызываете метод объекта.

class Foo(object):
     def bar(self, arg1, arg2):
         print arg1, arg2

foo = Foo()
# this:
foo.bar(1,2)  # prints '1 2'
# does about the same thing as this:
Foo.__dict__['bar'].__get__(foo, type(foo))(1,2)  # prints '1 2'

Объект classmethod работает точно так же. При поиске вызывается его метод __ get __ . __ get __ метода класса отбрасывает аргумент, соответствующий экземпляру (если он был), и передает только instance_type , когда он вызывает __ get __ обернутой функции.

Иллюстративный рисунок:

In [14]: def foo(cls):
   ....:     print cls
   ....:     
In [15]: classmethod(foo)
Out[15]: <classmethod object at 0x756e50>
In [16]: cm = classmethod(foo)
In [17]: cm.__get__(None, dict)
Out[17]: <bound method type.foo of <type 'dict'>>
In [18]: cm.__get__(None, dict)()
<type 'dict'>
In [19]: cm.__get__({}, dict)
Out[19]: <bound method type.foo of <type 'dict'>>
In [20]: cm.__get__({}, dict)()
<type 'dict'>
In [21]: cm.__get__("Some bogus unused string", dict)()
<type 'dict'>

Более подробную информацию о дескрипторах можно найти здесь (среди других мест): __ get __ метода класса отбрасывает аргумент, соответствующий экземпляру (если он был), и передает только instance_type , когда он вызывает __ get __ обернутой функции.

Иллюстративный рисунок:

In [14]: def foo(cls):
   ....:     print cls
   ....:     
In [15]: classmethod(foo)
Out[15]: <classmethod object at 0x756e50>
In [16]: cm = classmethod(foo)
In [17]: cm.__get__(None, dict)
Out[17]: <bound method type.foo of <type 'dict'>>
In [18]: cm.__get__(None, dict)()
<type 'dict'>
In [19]: cm.__get__({}, dict)
Out[19]: <bound method type.foo of <type 'dict'>>
In [20]: cm.__get__({}, dict)()
<type 'dict'>
In [21]: cm.__get__("Some bogus unused string", dict)()
<type 'dict'>

Более подробную информацию о дескрипторах можно найти здесь (среди других мест): __ get __ метода класса отбрасывает аргумент, соответствующий экземпляру (если он был), и передает только instance_type , когда он вызывает __ get __ обернутой функции.

Иллюстративный рисунок:

In [14]: def foo(cls):
   ....:     print cls
   ....:     
In [15]: classmethod(foo)
Out[15]: <classmethod object at 0x756e50>
In [16]: cm = classmethod(foo)
In [17]: cm.__get__(None, dict)
Out[17]: <bound method type.foo of <type 'dict'>>
In [18]: cm.__get__(None, dict)()
<type 'dict'>
In [19]: cm.__get__({}, dict)
Out[19]: <bound method type.foo of <type 'dict'>>
In [20]: cm.__get__({}, dict)()
<type 'dict'>
In [21]: cm.__get__("Some bogus unused string", dict)()
<type 'dict'>

Более подробную информацию о дескрипторах можно найти здесь (среди других мест): http://users.rcn.com/python/download/Descriptor.htm

Для конкретной задачи получения имени функции, обернутой методом класса :

In [29]: cm.__get__(None, dict).im_func.__name__
Out[29]: 'foo'
20
ответ дан 5 December 2019 в 07:58
поделиться

This looks like it has the goods.

1
ответ дан 5 December 2019 в 07:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: