سؤال

النظر في مثل هذا الرمز:

class A ():
   name = 7
   description = 8
   color = 9

class B(A):
   pass

يحتوي الفئة B الآن على (ورث) جميع سمات الفئة A. لسبب ما ، لا أريد B ألا أرث السمة "اللون". هل هناك إمكانية للقيام بذلك؟
نعم ، أنا أعلم ، أنه يمكنني أولاً إنشاء الفئة B مع سمات "اسم" و "وصف" ومن ثم ورث الفئة A من سمة "Color". ولكن في حالتي بالضبط ، B هو في الواقع أ انخفاض نسخة من A ، لذلك بالنسبة لي يبدو أكثر منطقية لإزالة السمة في B (إن أمكن).

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

المحلول

أعتقد أن أفضل حل هو قم بتغيير التسلسل الهرمي الخاص بك حتى تتمكن من الحصول على الفصول التي تريدها دون أي حيل فاخرة.

ومع ذلك ، إذا كان لديك سبب وجيه حقًا لعدم القيام بذلك ، فيمكنك إخفاء color ينسب باستخدام واصف. ستحتاج إلى استخدام فصول نمط جديدة لهذا العمل.

class A(object):
    name = 7
    description = 8
    color = 9

class Hider(object):
    def __get__(self,instance,owner):
        raise AttributeError, "Hidden attribute"

    def __set__(self, obj, val):
        raise AttributeError, "Hidden attribute"

class B(A):
    color = Hider()

ستحصل بعد ذلك على AttributeError عندما تحاول استخدام color ينسب:

>>> B.color
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in __get__
AttributeError: Hidden attribute
>>> instance = B()
>>> instance.color
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in __get__
AttributeError: Hidden attribute
>>> instance.color = 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in __set__
AttributeError: Hidden attribute

نصائح أخرى

يمكنك توفير قيمة مختلفة ل color في B ، ولكن إذا كنت تريد أن لا يكون لديك بعض الممتلكات A ، فهناك طريقة نظيفة واحدة فقط للقيام بذلك: إنشاء فئة قاعدة جديدة.

class Base():
    name = 7
    description = 8

class A(Base):
    color = 9

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