Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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
- class ParentClass(object):
- A = MyDescriptorClass() # here I am unable to pass the owner
- 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
- class MyDescriptorClass(object):
- def __init__(self, activates = 0):
- self.value = None
- self.activates = activates
- self.connects = []
- def __set__(self, instance, val): # 1
- if self.value == val:
- return 0
- self.value = val
- if self.activates:
- instance.evaluate()
- def __get__(self, instance, instcls): # 1
- return self.value
- class GateInput(object):
- def __init__(self, index):
- self.index = index # 4
- def __get__(self, inst, instcls):
- return inst.inputs[self.index].ans # 5
- def __set__(self, inst, val):
- if isinstance(val, (float, int)):
- inst.inputs[self.index] = Constant(val)
- else:
- inst.inputs[self.index] = val
- class Constant(object):
- def __init__(self, val):
- self.ans = val
- class Gate(object):
- A = GateInput(0) # 1
- B = GateInput(1) # 1
- def __init__(self, name):
- self.name = name
- self.inputs = [Constant(0), Constant(0)] # 2
- class Adder(Gate):
- @property
- def ans(self):
- result = 0
- for gate in self.inputs:
- result += gate.ans # 3
- return result
- class Multiplier(Gate):
- @property
- def ans(self):
- result = 1
- for gate in self.inputs:
- result *= gate.ans
- return result
- b = Multiplier('b1')
- b.A = 2
- b.B = 3
- print(b.A)
- # 2
- print(b.ans)
- # 6
- c = Adder('c1')
- c.A = 10
- print(c.ans)
- # 10
- # This connects output of b to an input of c
- c.B = b
- print(c.ans)
- # 16
- class MyDescriptorClass(object):
- def __init__(self):
- self.data = defaultDict(dict)
- def configure(self, owner, name, activates = 0):
- container = self.data(id(owner))
- container["value"] = None
- container["name"] = name
- ...
- def __set__(self, owner, value):
- # implemnt your previous "set" method straight here
- ...
- ...
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement