object
가 아닌 Base.__bases__
Base.__base__
경우 동적으로 변경하는 것이 가능하다는 것을 나타납니다. (동적으로 변경한다는 의미는 Base
에서 상속받은 모든 기존 인스턴스도 동적으로 변경된다는 의미입니다. 그렇지 않은 경우 Mykola Kharechko's solution 참조). Base.__base__
일부 더미 클래스 TopBase
경우
후 Base.__bases__
에 할당 작동하는 것 같다 :
class Extender(object):
def extension(self):
print("Some work...")
class TopBase(object):
pass
class Base(TopBase):
pass
b=Base()
print(Base.__bases__)
# (<class '__main__.TopBase'>,)
Base.__bases__ += (Extender,)
print(Base.__bases__)
# (<class '__main__.TopBase'>, <class '__main__.Extender'>)
Base().extension()
# Some work...
b.extension()
# Some work...
Base.__bases__ = (Extender, TopBase)
print(Base.__bases__)
# (<class '__main__.Extender'>, <class '__main__.TopBase'>)
Base().extension()
# Some work...
b.extension()
# Some work...
이 (새로 만들기 및 이전 스타일 클래스) 파이썬 2에서 작동하도록 테스트 및 파이썬 3되었다. 나는 이것이 작동하지 않는 이유는 모르겠다.
class Extender(object):
def extension(self):
print("Some work...")
class Base(object):
pass
Base.__bases__ = (Extender, object)
# TypeError: __bases__ assignment: 'Extender' deallocator differs from 'object'
귀하의 기지는 더 이상 당신 소유의 것이 아닙니까? 그리고 대답은 어려울 것입니까? – Borealid
필자는 모든 클래스가 파이썬 3에서 새로운 스타일의 클래스이고, Base가'object'와'Extender'를 기본 클래스로 가졌다면 MRO가 모호해지기 때문에 더 이상 불가능하다고 생각합니다. 대신에'Base'와'Extender'를 상속받은 새로운 클래스를 생성하십시오. 'Extender'는 ABC 일 수도 있습니다. – Philipp