Cep*_*pod 24 python object-model
创建对象后,我可以随意添加和删除插槽,就像我可以使用字典一样.甚至方法也只是存储在槽中的对象,所以我可能也可以将方法添加到字典中.
我可以用一个(非字典)对象做一些我永远不会用字典做的事情吗?或者是否可以设置一个完全看起来像某个类的对象的字典?
这个问题不是关于它们是如何创建的,而是关于我以后如何使用它们的问题.链接或参考表示赞赏.
agf*_*agf 17
创建对象后,我可以随意添加和删除插槽,就像我可以使用字典一样.甚至方法也只是存储在插槽中的对象,
小心说插槽 - __slots__在Python中具有特定含义.
所以我可能也可以在字典中添加方法.
foo = {}
foo.bar = 1
AttributeError: 'dict' object has no attribute 'bar'
Run Code Online (Sandbox Code Playgroud)
默认情况下,您不需要对其进行子类化 - 但之后您正在使用类.相反,将函数放在字典中:
def bar():
return 1
foo['bar'] = bar
foo['baz'] = lambda: 1
Run Code Online (Sandbox Code Playgroud)
我可以用一个我永远不能用字典做的对象吗?
这个问题实际上有一个错误的前提 - 词典是对象,所以你用一个对象的字典做任何事情.对于这个答案的其余部分,当你说"对象"时,我会假装你的意思是"用户定义的类".
不,您无法使用字典无法处理的用户定义的类.甚至用字典实现类.
class Foo(object):
pass
print Foo.__dict__
# {'__dict__': <attribute '__dict__' of 'Foo' objects>, '__module__': '__main__',
# '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None}
Run Code Online (Sandbox Code Playgroud)
你可以用Python中的一个类做任何事情,你可以做更多的工作(以及更难理解,使用和维护的代码).甚至有人说Python类只是字典的语法糖.
最近有一个非常相似的问题,我是否需要了解对象,还是可以节省时间并学习字典?我认为我的回答在这里也很重要.
sth*_*sth 11
当您调用对象的成员函数时,它们将作为第一个参数传递给对象本身.这样他们就可以修改他们所属对象的属性:
class Counter(object):
def __init__(self):
self.num = 0
def inc(self):
self.num += 1
count = Counter()
count.inc()
Run Code Online (Sandbox Code Playgroud)
如果你只是将一堆函数存储在a中dict,它们就不会得到这样的支持.你必须手动传递dict以达到同样的效果:
def Counter_inc(d):
d['num'] += 1
def Counter_create():
d = {
'num': 0,
'inc': Counter_inc,
}
return d
count = Counter_create()
count['inc'](count)
Run Code Online (Sandbox Code Playgroud)
正如你可以看到的那样,它更加笨拙.虽然您可以使用原始dicts模拟对象的许多功能,但对对象具有特殊语言支持使它们更易于使用.
还有一些功能可以直接使用对象类型信息,例如isinstance(),使用原始dicts无法轻松复制.
| 归档时间: |
|
| 查看次数: |
5971 次 |
| 最近记录: |