在Python中使用插槽和“常量”

时间:2019-08-23 19:22:36

标签: python

我正在使用python中的一些LDAP数据(我不太擅长Python),并试图组织一个类对象来保存LDAP变量。由于是LDAP数据,最终结果将是在可迭代列表中收集的相同数据结构(每个用户)的许多副本。

我开始使用__slots__的硬编码属性名称,该名称似乎有效,但是随着事情的进展,我意识到那些LDAP属性应该是某种不变的常量,以最大程度地减少硬编码文本/打字错误。我为__slot__属性分配了变量,但这似乎不是一个可行的计划:

AttributeError: 'LDAP_USER' object has no attribute 'ATTR_GIVEN_NAME'

现在考虑一下,我实际上并没有使用ATTR_定义创建不可变“常量”,因此从理论上讲,可以在运行时更改这些值。我可以理解为什么Python可能对此设计有问题。

在维护可实例化的类对象的同时,减少代码中硬编码文本的使用的更好方法是什么?

ATTR_DN                    = 'dn'
ATTR_GIVEN_NAME            = 'givenName'
ATTR_SN                    = 'sn'
ATTR_EMP_TYPE              = 'employeeType'

class LDAP_USER (object):
   __slots__ = ATTR_GIVEN_NAME, ATTR_DN, ATTR_SN, ATTR_EMP_TYPE

user = LDAP_USER()

user.ATTR_GIVEN_NAME = "milton"
user.ATTR_SN         = "waddams"
user.ATTR_EMP_TYPE   = "collating"

print ("user is " + user.ATTR_GIVEN_NAME)

1 个答案:

答案 0 :(得分:0)

__slots__定义为[ATTR_GIVEN_NAME, ATTR_DN]的情况下,应使用user.givenNameuser.dn来引用属性,因为这些是__slots__中的字符串值。

如果您想将属性实际引用为user.ATTR_GIVEN_NAME,则该属性应为__slots__数组中的值。然后,您可以添加一个映射例程,以在对对象执行LDAP操作时将对象属性转换为LDAP字段。

引用不在__slots__中的属性会产生错误,因此在运行时会捕获错别字。