سؤال

أنا أكتب البرامج النصية Python لـ Blender لمشروع ، لكنني جديد تمامًا على اللغة. شيء أنا في حيرة من أمري هو استخدام المتغيرات الثابتة. إليك جزء من الكود الذي أعمل عليه حاليًا:

class panelToggle(bpy.types.Operator):
    active = False

    def invoke(self, context, event):
        self.active = not self.active
        return{'FINISHED'}

class OBJECT_OT_openConstraintPanel(panelToggle):
    bl_label = "openConstraintPanel"
    bl_idname = "openConstraintPanel"

الفكرة هي أن الصف الثاني يجب أن يرث نشيط متغير و يستحضر الطريقة من الأول ، بحيث يغير استدعاء Object_ot_openconstraintpanel.invoke () object_ot_openconstraintpanel.active. استخدام الذات كما فعلت أعلاه لن تعمل ، ولا استخدام Paneltoggle في حين أن. أي فكرة عن كيفية ذلك؟

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

المحلول

استعمال type(self) للوصول إلى سمات الفصل

>>> class A(object):
 var  = 2
 def write(self):
  print type(self).var
>>> class B(A):
 pass
>>> B().write()
2
>>> B.var = 3
>>> B().write()
3
>>> A().write()
2

نصائح أخرى

يمكنك الوصول active من خلال الفصل ينتمي إلى:

if panelToggle.active:
    # do something

إذا كنت تريد الوصول إلى صف دراسي متغير من طريقة ، يمكنك الكتابة:

def am_i_active(self):
    """ This method will access the right *class* variable by
        looking at its own class type first.
    """
    if self.__class__.active:
        print 'Yes, sir!'
    else:
        print 'Nope.'

يمكن العثور على مثال عمل هنا: http://gist.github.com/522619


ال self متغير (اسمه self حسب الاتفاقية) هو المثيل الحالي للفئة ، مرت ضمنيًا ولكن تم استلامه بشكل واضح.

class A(object):

    answer = 42

    def add(self, a, b):
        """ ``self`` is received explicitely. """
        return A.answer + a + b

a = A()

print a.add(1, 2) # ``The instance -- ``a`` -- is passed implicitely.``
# => 45

print a.answer 
# => print 42
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top