首页 / PYTHON / 在Python中创建真正的空类型
在Python中创建真正的空类型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Python中创建真正的空类型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2039字,纯文字阅读大概需要3分钟。
内容图文
![在Python中创建真正的空类型](/upload/InfoBanner/zyjiaocheng/816/10fc05cee1cb484b96510ebf894f8432.jpg)
我经常想在Python中创建完全空的对象.基本上,我想要一个键是属性的字典.在Python 2.x中,我可以创建一个这样的旧式类型:
class Empty: pass
这将创建一个只有两个属性(__doc__和__module__)的类型.在Python 3.x中,一切都是新式的类,所以我得到了18个属性.
在我目前的情况下,我有一个类,允许您指定在单元测试中需要猴子修补的类型.应用补丁时,我正在创建一个类型,其属性包含每个模拟类型的名称.这几乎是我当前的实现正在做的事情:
class EmptyType: pass
...
mocks = EmptyType()
for mock_name, mock in patches:
setattr(mocks, mock_name, mock)
我担心的是,如果某人嘲笑私人成员,他们可能会遇到与EmptyType对象中的名称命名冲突.这就是为什么我想尽可能少地保留EmptyType中的属性.而且说mocks.find_users比说mocks [“find_users”]更容易,特别是当我知道名字必须是有效的标识符时.
现在,我已经提供了为mocks提供不同名称的能力,除了默认值之外.不过,首先避免混淆错误会很好.在JavaScript中创建几乎空的类型非常容易,我希望在Python中有类似的东西,因为我一直在寻找它们的好用途.
解决方法:
如何创建自己的自定义容器?
class Empty(object):
def __init__(self, **kwargs):
object.__setattr__(self, '_obj', kwargs)
def __getattribute__(self, name):
obj = object.__getattribute__(self, '_obj')
try:
return obj[name]
except KeyError:
cls_name = object.__getattribute__(self, '__class__').__name__
raise AttributeError(
"'%(cls_name)s' object has no attribute '%(name)s'" % locals())
def __setattr__(self, name, val):
obj = object.__getattribute__(self, '_obj')
obj[name] = val
def __getitem__(self, key):
return getattr(self, key)
def __setitem__(self, key, val):
return setattr(self, key, val)
用法:
e = Empty(initial='optional-value')
e.initial
# 'optional-value'
e.val = 'foo'
e.val
# 'foo'
e.bad
# AttributeError: 'Empty' object has no attribute 'bad'
setattr(e, 'user', 'jdi')
e.user
# 'jdi'
e['user']
# 'jdi'
# note that you dont even see anything when you dir()
dir(e)
# []
# and trying to access _obj is protected
e._obj
#AttributeError: 'Empty' object has no attribute '_obj'
# But you could even set your own _obj attribute
e._obj = 1
e._obj
# 1
它会将所有内容存储在_obj字典下,因此您基本上可以获得一个与实际实例属性不冲突的干净空间.
内容总结
以上是互联网集市为您收集整理的在Python中创建真正的空类型全部内容,希望文章能够帮你解决在Python中创建真正的空类型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。