我有一个函数,它从电子表格中获取数据,并将数据处理到字典中
def get_employee_data(path=None):
# load excel file from 'path'
# return processed data as dictionary
return {
'bob':{'id':'12039123','age':90,'occupation':'manager'},
'john':{'id':'43434433','age':66,'occupation':'janitor'},
'hannah':{'id':'48484839','age':1,'occupation':'proffesional hamster'},
}
init方法在字典上迭代,以设置类属性,其中"属性名称"是基于员工名称设置的-我希望它存储我的描述符类"employee">
class Employee:
def __set_name__(self, owner, name):
self.public_name = name
self.private_name = '_' + name
def __get__(self, obj, objType=None):
print('GET...')
return getattr(obj, self.private_name)
def __set__(self, obj, value):
print('SET...')
setattr(obj, self.private_name, value)
class ManagementSystem:
employee_data = get_employee_data()
william = Employee() # test works as expected
def __init__(self):
for employee in self.employee_data:
setattr(self, employee, Employee())
self.william = 'william' # test works as expected
使用相同的设计,我的目标是创建另一个描述符来处理对雇用详细信息的访问,其中所述描述符将在"Employee"类中分配
class EmployeeDetail:
# example implementation:
# ms.bob.id
pass
为了进行测试,我为ManagementSystem"william"创建了一个类属性,它按预期工作,但访问使用setattr((实例化的属性"bob"的行为与不同
>>> ms = ManagementSystem()
SET...
>>> ms.william
GET...
'william'
>>> ms.william = 'walliamson'
SET...
>>> ms.bob
<__main__.Employee object at 0x7f7f01a54e20>
>>> ms.bob = 'bob'
>>> ms.bob
'bob'
我对为什么会这样有一些理解,但一直未能找到解决这个问题的办法。
一如既往地感谢您的帮助:(
好吧,这让我觉得很傻,但我已经找到了一个解决方案,因为我已经回去测试了一些基于这个答案的东西:
定义类时,在python中设置具有给定名称的类属性
class ManagementSystem:
employee_data = get_employee_data()
for employee in employee_data:
vars()[employee] = Employee()
def __init__(self):
for employee in self.employee_data:
setattr(self, employee, employee)
我相信我之前试图在类属性之外设置属性(我正在创建实例属性(:
"william"是一个类属性,因此存储描述符实例将处理行为-bob不能遵循相同的行为,并且只是"Employee"类的一个实例,因此当我尝试设置bob时,它会被覆盖
尽管如此,如果有更有效的方法来做到这一点(或者我的理解似乎不完整(,我仍然非常感谢对我给出的答案/解释的改进
谢谢:(