سؤال

كيف يمكنني إضافة طريقة مثيل إلى فصل دراسي باستخدام فئة تعريفية (نعم أحتاج إلى استخدام فئة تعريفية)؟يعمل النوع التالي، لكن func_name سيظل "foo":

def bar(self):
    print "bar"

class MetaFoo(type):
    def __new__(cls, name, bases, dict):
        dict["foobar"] = bar
        return type(name, bases, dict)

class Foo(object):
    __metaclass__ = MetaFoo

>>> f = Foo()
>>> f.foobar()
bar
>>> f.foobar.func_name
'bar'

مشكلتي هي أن بعض أكواد المكتبة تستخدم بالفعل func_name ثم تفشل لاحقًا في العثور على طريقة "bar" لمثيل Foo.بإمكاني عمل:

dict["foobar"] = types.FunctionType(bar.func_code, {}, "foobar")

هناك أيضًا أنواع.MethodType، لكني بحاجة إلى مثيل غير موجود حتى الآن لاستخدامه.هل أفتقد شيئًا ما هنا؟

هل كانت مفيدة؟

المحلول

حاول توسيع القواعد ديناميكيًا بهذه الطريقة التي يمكنك من خلالها الاستفادة من mro والطرق هي طرق فعلية:

class Parent(object):
    def bar(self):
        print "bar"

class MetaFoo(type):
    def __new__(cls, name, bases, dict):
        return type(name, (Parent,) + bases, dict)

class Foo(object):
    __metaclass__ = MetaFoo

if __name__ == "__main__":
    f = Foo()
    f.bar()
    print f.bar.func_name

نصائح أخرى

أعتقد أن ما تريد القيام به هو هذا:

>>> class Foo():
...   def __init__(self, x):
...     self.x = x
... 
>>> def bar(self):
...   print 'bar:', self.x
... 
>>> bar.func_name = 'foobar'
>>> Foo.foobar = bar
>>> f = Foo(12)
>>> f.foobar()
bar: 12
>>> f.foobar.func_name
'foobar'

الآن أنت حر في المرور Fooق إلى المكتبة التي تتوقع Foo المثيلات لديها طريقة مسماة foobar.

لسوء الحظ، (1) لا أعرف كيفية استخدام الفئات التعريفية و(2) لست متأكدًا من أنني قرأت سؤالك بشكل صحيح، ولكن آمل أن يكون هذا مفيدًا.

لاحظ أن func_name يمكن تعيينه فقط في Python 2.4 والإصدارات الأحدث.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top