я понимаю разницу между атрибутами экземпляра и атрибутами класса в Python? - PullRequest
1 голос
/ 05 октября 2011

Допустим, у меня есть метод и класс:

def my_method(self):
    self.mark = 'Knopfler'

class MySubclass(object)
    my_method = my_method

Я могу придумать 3 или 4 способа использования my_method в другом классе.

Случай 1: Если я хочу иметь доступ к my_method в еще одном классе, как этот:

class MyClass(object):
    def __init__(self):
        self.my_subclass = MySubclass()

Правильно ли я считаю, что это позволит мне использовать my_method в таком случае:

my_inst = MyClass()
my_inst.my_subclass.my_method()

Кажется, это работает так, как я ожидал, но если я сделаю это так: Дело 2:

class MyClass(object):
    my_subclass = MySubclass

my_inst = MyClass()
my_inst2 = MyClass()
my_inst.my_subclass.my_method()

, насколько я понимаю, предыдущая строка будет применяться my_method как к my_inst, так и к my_inst2. Это верно?

Случай 3: Другой способ получить my_method в качестве атрибута MyClass:

class MyClass(object):
    my_method = my_method

и, насколько я понимаю, когда у меня несколько экземпляров MyClass, применение my_method повлияет только на тот экземпляр, к которому он привязан. Это верно?

Случай 4 (последний):

class MyClass(object):
    def __init__(self):
        self.my_method = my_method

и проблема с этим последним методом заключается в том, что он создает my_method как несвязанный метод, который не соответствует моим потребностям. Есть ли способ добавить существующий метод в качестве метода привязанного экземпляра в определении класса?

Ok. Это все. Пожалуйста, дайте мне знать, какой из этих четырех случаев наиболее целесообразно использовать. Благодарю.

1 Ответ

1 голос
/ 18 октября 2011

Отвечая на ваш последний случай, вы можете привязать метод к экземпляру класса с помощью MethodType:

import types

class MyClass(object):
    def __init__(self):
        self.my_method = types.MethodType(my_method, self)
...