Как сделать функцию Python всегда несвязанной, даже назначенной атрибуту класса - PullRequest
0 голосов
/ 24 января 2012

Имея следующий код, что я могу сделать с функцией 'foo', чтобы сделать ее несвязанной в любом случае, даже если она назначена атрибуту класса? Переопределение __get__ не помогает - насколько я понимаю, потому что оно не используется, когда функция отсутствует в __dict__ экземпляра (это так в случае атрибутов класса). Но что еще здесь можно сделать?

def foo(x):
    print(x)

def foo_get(self, obj, type=None):
    return foo

foo.__get__ = foo_get

class A(object):
    def __init__(self):
        self.f = foo
class B(object):
    f = foo


a = A()

print(a.f)               #<function foo at 0x2321d10>
print(a.f.__get__(a, A)) #<function foo at 0x2321d10>

b = B()

print(b.f)               #<bound method B.foo of <__main__.B object at 0x23224d0>>

1 Ответ

6 голосов
/ 24 января 2012

Я уверен, что вы хотите @staticmethod.

foo = staticmethod(foo)

Вы также можете определить __get__ для вызываемого класса:

class Foo(object):
    def __get__(self, obj, type=None):
        return self

    def __call__(self, x):
        print(x)

foo = Foo()

class A(object):
    def __init__(self):
        self.f = foo
class B(object):
    f = foo


foo(1) # 1
a = A()

a.f(1) # 1
print(a.f)               #<function foo at 0x2321d10>
print(a.f.__get__(a, A)) #<function foo at 0x2321d10>

b = B()
b.f(1) # 1


print(b.f)               #<__main__.Foo object at 0x7fa8c260be10>

Это один дополнительный уровень отступа и несколько дополнительных строк кода, но это то, как это можно сделать, если это важно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...