कोड के रूप में नीचे है, सिर्फ बुनियादी संरचना:निकाला जा रहा है विशिष्ट विधियों
class FooType(type):
def __new__(cls, name, bases, classdict):
instance = type.__new__(cls, name, bases, classdict)
# What can I do here?
return instance
class FooBase(object, metaclass=FooType):
def __init__(self):
pass
class Foo(FooBase):
def __init__(self, name):
self.name = name
def method1(self):
pass
def method2(self):
pass
def specialmethod(self):
pass
class A(Foo):
pass
class B(Foo):
pass
class C(Foo):
_disallowed_methods = ['specialmethod']
मुझे क्या करना चाहते हैं, उस वर्ग C
के उदाहरण specialmethod
नहीं होना चाहिए है, लेकिन यह विधि A
और B
उदाहरणों के लिए उपलब्ध होनी चाहिए।
मैं कक्षा C
में इस विधि को ओवरराइड कर सकता हूं और एक त्रुटि उठा सकता हूं, लेकिन मैं ऐसा नहीं करना चाहूंगा।
मैं मैं अगर instance
dir(instance)
के उत्पादन में उनमें से किसी को है FooType
में _disallowed_methods
के लिए और कहा कि जांच के आधार पर जांच करने के लिए कोड में जोड़ सकते हैं एहसास। लेकिन मैं अब तक की कोशिश की गई किसी भी विधि का उपयोग कर __dict__
C
से विधि को हटाने के लिए प्रतीत नहीं कर सकता। मैंने कोशिश की विधियों delattr(instance, 'specialmethod')
, और del instance.__dict__['specialmethod']
हैं। में
delattr
विधि परिणाम "AttributeError: specialmethod", और में del
विधि परिणाम "लेखन त्रुटि: 'dict_proxy' ऑब्जेक्ट आइटम हटाए जाने का समर्थन नहीं करता"
मूल रूप से कई अलग अलग वर्गों Foo
से इनहेरिट करेंगे, लेकिन के कुछ उनके पास C
जैसे विशिष्ट विधियां उपलब्ध नहीं होनी चाहिए जिनके पास specialmethod
उपलब्ध नहीं होना चाहिए।
मैं क्या गलत कर रहा हूं? या मैं इसे और कैसे पूरा कर सकता हूं?
बीटीडब्ल्यू: यह [लिस्कोव प्रतिस्थापन सिद्धांत] (http://en.wikipedia.org/wiki/Liskov_substitution_principle) का उल्लंघन करेगा। – pillmuncher