Я пытаюсь создать класс дескриптора, который я могу использовать через другой класс, который является подклассом класса, который является подклассом класса.Дизайн класса дескриптора в Python (с наследованием)
class MyDescriptorClass(object):
def __init__(self, owner, name, activates = 0):
self.value = None
self.name = name
self.owner = owner
self.activates = 0
self.connects = []
def __set__(self, obj, val):
self.set(val)
def __get__(self, instance, owner):
return self.value
def set(self, value):
if self.value == value:
return 0
self.value = value
if self.activates:
self.owner.evaluate()
def connect(self, inputs):
if not isinstance(inputs, list):
inputs = list(inputs)
for input in inputs:
self.connects.append(input)
class ParentClass(object):
def __init__(self, name):
self.states = {}
self.name = name
self.A = MyDescriptorClass(self, name, activates = 1)
self.B = MyDescriptorClass(self, name, activates = 1)
self.states.setDefault('A', self.A)
self.states.setDefault('B', self.B)
class ChildClass1(ParentClass):
def __init__(self, name)
super(ChildClass1, self).__init__(name)
self.ans = None
def evaluate(self):
self.ans = self.A.value + self.B.value
class ChildClass2(ParentClass):
def __init__(self, name)
super(ChildClass1, self).__init__(name)
self.ans = None
def evaluate(self):
self.ans = self.A.value * self.B.value
self.A = MyDescriptorClass()
не будет работать в соответствии с python docs
так что единственный способ, что я declate A = MyDescriptorClass()
в ParentClass
в
class ParentClass(object):
A = MyDescriptorClass() # here I am unable to pass the owner
И так, я использую класс ребенка, super
вызов пропускает эту часть и начинается с __init__
Есть ли способ, в котором я могу изменить дизайн, чтобы напрямую установить значение ChildClass1.A
экземпляра?
c = ChildClass1("c1")
c.A = 10 # I directly want to set this value instead of using c.A.set(10)
c.B = 20
c.evaluate()
print c.ans # 30
c.B = 40
print c.ans # 50
Значит, вам нужен владелец, чтобы быть «ParentClass» вместо того, чтобы связать класс? –
Я не уверен, что следую вашему вопросу; нет, вы не можете установить дескрипторы в качестве атрибутов экземпляра, они должны находиться в классе. Но я не понимаю, чего вы пытаетесь достичь с помощью вашего дескриптора. –
Подкласс будет наследовать дескрипторы из иерархии их родительского класса, поэтому 'self.A' будет доступен в' ChildClass2', если 'A' является атрибутом класса. –