python - 为什么 __init__() 方法中的属性不显示在 dir(Foo) API 中?
问题描述
我无法理解为什么 dir(Foo) 不显示在init方法中定义的属性。我搜索并找到了 Kindall 答案。但仍然无法完全理解。 Python dir(dict) 与 dir(dict.__class__)
class Foo(object):
kind = 'car'
def __init__(self, a):
self.a = a
def bar(self, b):
return self.a + b
f = Foo(1)
print(dir(Foo)) #['bar','kind']
print(dir(f)) #['a','bar','kind']
解决方案
很简单,在被调用a
时被创建__init__
。由于dir(Foo)
不调用__init__
,因此a
永远不会被创建。
换句话说,a
是 的一个实例的一部分Foo
,而不是Foo
它本身。没有Foo.a
,只有Foo().a
。
在 Python 中,可以随时向用户定义的对象添加属性。也许以下内容会让事情变得更清楚:
class Bar(object):
pass
bar = Bar()
print(dir(bar))
bar.a = 42
print(dir(bar))
您的示例不同的主要方式是a
恰好在__init__
调用期间而不是在调用之后创建。
推荐阅读
- eclipse - 如何修复从 luaJ 获得的“启动层初始化期间发生错误”
- matlab - Matlab 给我警告:可能是虚假的解决方案
- python - 如何从仅在滚动后才显示响应的网站上一次抓取所有数据?
- javascript - 将没有加密的数据发送到 Twilio getToken 函数
- html - 如何更改选项卡图标?
- node.js - 如何使用反应将输入输入到结构化数组(嵌套),数组大小将动态决定
- javascript - Woocommerce:Ajax 添加到购物车在 WP Bakery 页面构建器中不起作用
- asp.net-core - dotnet restore 失败,使用 NU1101 用于 Docker 容器中的私有 Github 包,但在我的本地机器上工作
- flutter - 如何像 quetsion 中的图像一样在颤动中创建底部?
- arduino-esp8266 - 编译nodemcu ESP8266板时出错