قم بإزالة سمة الفصل في Python الفئة الموروثة
-
01-10-2019 - |
سؤال
النظر في مثل هذا الرمز:
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