Вам нужен собственный дескриптор, а не property
.
class Force(object):
def __init__(self, type_, var):
self.type = type_
self.var = "_" + var
def __get__(self, obj, type):
# obj is None when the descriptor is accessed via
# the class, rather than an instance.
# type is the class through which the descriptor is accessed;
# not used here.
if obj is None:
return self
return getattr(obj, self.var)
def __set__(self, obj, value):
setattr(obj, self.var, self.type(value))
class Node:
ID = Force(int, 'ID')
X = Force(float, 'X')
Y = Force(float, 'Y')
Z = Force(float, 'Z')
def __init__(self):
self.ID = 0
self.X = 0
self.Y = 0
self.Z = 0
В Python 3.6 добавлена поддержка метода __set_name__
, который вызывается автоматически при создании экземпляра дескриптора, получая имядескриптор назначен в качестве аргумента.
class Force:
def __init__(self, type_):
self.type = type_
def __set_name__(self, owner, name):
# Owner is the class which contains the descriptor;
# not used here
self.var = "_" + name
def __get__(self, obj, type):
if obj is None:
return self
return getattr(obj, self.var)
def __set__(self, obj, value):
setattr(obj, self.var, self.type(value))
class Node:
ID = Force(int)
X = Force(float)
Y = Force(float)
Z = Force(float)
def __init__(self):
self.ID = 0
self.X = 0
self.Y = 0
self.Z = 0
(я уверен, что это можно улучшить. Force.__init__
может принимать начальное значение для каждого экземпляра дескриптора вместо необходимости Node.__init__
для инициализациикаждый.)