kod sadece temel yapısı aşağıdaki gibidir:Çıkarma spesifik yöntemler
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']
Ne yapmak istiyorum, sınıfın C
örnekleri specialmethod
sahip olmaması gerektiğini ancak Bu yöntem, A
ve B
örneklerine açık olmalıdır.
Bu yöntemi C
sınıfında geçersiz kılabilir ve bir hata oluşturabilirim, ancak bunu yapmamayı tercih ederim.
ben instance
dir(instance)
çıkışında bunlardan herhangi varsa FooType
yılında _disallowed_methods
için ve o çek temelinde kontrol etmek kodunda ekleyebilir biliyoruz. Ancak, şu ana kadar denedim herhangi bir yöntem kullanarak yöntemi __dict__
C
10'dan kaldırmış gibi görünmüyorum. Denediğim yöntemler delattr(instance, 'specialmethod')
ve del instance.__dict__['specialmethod']
'dur. içinde
delattr
yöntem sonuçları "AttributeError: specialmethod" ve içinde del
yöntemi sonuçları "TypeError: 'dict_proxy' nesne öğesi silme desteklemiyor"
Temelde birçok farklı sınıflar Foo
devralan, ancak bazı Onlara, C
gibi, specialmethod
kullanılabilir olmayan özel yöntemler bulunmamalıdır.
Neyi yanlış yapıyorum? Ya da bunu başka nasıl yapabilirim?
BTW: Bu [Liskov İkame Prensibi] 'ni (http://en.wikipedia.org/wiki/Liskov_substitution_principle) ihlal eder. – pillmuncher