gpt4 book ai didi

python - 从父类继承的子类中删除特定方法

转载 作者:太空狗 更新时间:2023-10-29 20:23:20 26 4
gpt4 key购买 nike

代码如下,只是基本结构:

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 类中覆盖此方法并引发错误,但我不想这样做。

我意识到我可以添加代码来检查 FooType 中的 _disallowed_methods 并在此基础上检查 instance 是否有任何它们在 dir(instance) 的输出中。但是我似乎无法使用我目前尝试过的任何方法从 C__dict__ 中删除该方法。我尝试的方法是 delattr(instance, 'specialmethod')del instance.__dict__['specialmethod']

delattr 方法导致“AttributeError: specialmethod”,del 方法导致“TypeError: 'dict_proxy' object does not support item deletion”

基本上很多不同的类都会继承自 Foo,但是其中一些类不应该有特定的可用方法,比如 C 不应该有 specialmethod 可用。

我做错了什么?或者我还能如何做到这一点?

最佳答案

如果您有一个不想修改的父对象,以及一个具有一个或多个您希望不可访问的继承方法的子对象,您可以使用描述符来实现。最简单的方法之一是使用内置的 property:

class Parent:
def good_method(self):
print('Good one')

def bad_method(self):
print('Bad one')

class Child(Parent):
bad_method = property(doc='(!) Disallowed inherited')

one = Parent()
one.good_method() # > 'Good one'
one.bad_method() # > 'Bad one'

two = Child()
two.good_method() # > 'Good one'
two.bad_method() # > AttributeError: unreadable attribute
two.bad_method # > AttributeError: unreadable attribute
two.bad_method = 'Test' # > AttributeError: can't set attribute

help(two) 如何打印它:

class Child(Parent)
| Method resolution order:
| Child
| Parent
| builtins.object
|
| Data descriptors defined here:
|
| bad_method
| (!) Disallowed inherited
|
| ----------------------------------------------------------------------
| Methods inherited from Parent:
|
| good_method(self)
|
| ----------------------------------------------------------------------
| Data descriptors inherited from Parent:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)

我觉得还不错。但是如果其他方法依赖它们,你应该小心不要以这种方式定义继承的方法(这可以通过使用代理类来避免,它继承自父类并重新定义这些方法以使用 super().bad_method() 而不仅仅是 self.bad_method() 并将 bad_method 本身指向不允许的描述符)。如果需要,您可以编写更复杂的描述符逻辑

关于python - 从父类继承的子类中删除特定方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6693811/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com