Если вас беспокоит обратный вызов, поддерживающий работу экземпляра, не передает связанный метод .self.BgError
создает объект метода (через протокол дескриптора ), который ссылается на объект экземпляра, потому что он должен иметь доступ к этому экземпляру при его вызове;вот как параметр self
передается в первую очередь.
Если вам не нужно ссылаться на состояние экземпляра, а API обратного вызова может обрабатывать несвязанные методы или метод класса или статические методы, тогда передайте одинвместо этого.
Например, вы можете сделать BgError
метод класса или статический метод:
@classmethod
def BgError(cls):
# ...
Теперь и Client.BgError
, и self.BgError
(instance_of_Client.BgError
)создайте объект метода, привязанный к классу, а не к экземпляру, что даст вам согласованное поведение.Никаких дополнительных ссылок на экземпляр не делается.
Если вам нужно состояние экземпляра, передайте функцию-обертку со слабой ссылкой вашему экземпляру.При вызове проверьте, доступна ли слабая ссылка, прежде чем использовать экземпляр.Также см. с использованием Python WeakSet для включения функции обратного вызова для более подробного сообщения о обратных вызовах и слабых ссылках.Там реестр обратных вызовов заботится о создании и хранении слабых ссылок, но применяются те же принципы.