python - 在 Python 中使用类定义调用实例方法
问题描述
最近,我一直在研究 Python 的类实例化过程,以真正了解在创建类实例时会发生什么。但是,在玩弄测试代码时,我遇到了一些我不明白的东西。
考虑这个虚拟类
class Foo():
def test(self):
print("I'm using test()")
通常,如果我想使用Foo.test
instance method,我会去创建一个实例Foo
并像这样显式调用它,
foo_inst = Foo()
foo_inst.test()
>>>> I'm using test()
但是,我发现以这种方式调用它最终会得到相同的结果,
Foo.test(Foo)
>>>> I'm using test()
在这里,我实际上并没有创建实例,但我仍在访问Foo
的实例方法。为什么以及如何在 Python 的上下文中工作?我的意思是self
通常指的是类的当前实例,但在这种情况下,从技术上讲,我并不是在创建类实例。
print(Foo()) #This is a Foo object
>>>><__main__.Foo object at ...>
print(Foo) #This is not
>>>> <class '__main__.Foo'>
解决方案
向在评论部分引导我到那里的每个人的道具。
这个问题的答案依赖于 Python 的两个基础知识:
- 鸭子打字
- 一切都是对象
事实上,即使self
Python 习惯于引用当前类实例,由于 Python 处理类型的方式,您在技术上可以传递您想要的任何对象。
现在,另一个让我感到困惑的是,我没有在第二个示例中创建对象。但是,问题是,Foo
在内部已经是一个对象。
这可以像这样进行经验测试,
print(type(Foo))
<class 'type'>
所以,我们现在知道这Foo
是一个类的实例,因此即使它不是自身的实例type
也可以传递。self
基本上,如果我要像我的方法中的对象self
一样操作它,那么在像我的第二个示例一样调用它时会遇到问题。Foo
test
推荐阅读
- java - 在 Catalina 上全新安装后尝试使用 sbt 运行 Play Scala 应用程序时出错:“加载 JNotify 监视服务时出错:null”
- android - 我的证书更新后我的应用程序停止工作
- python - 无法使用 ChemDataExtractor 在 Windows 10 中执行“cde 数据下载”
- apache-spark - 如何在 PySpark 中读取由多个字符分隔的文本文件?
- wordpress - Wordpress Json 解码
- python - 如何在不让其他值乱序的情况下对堆叠的 numpy 数组进行排序
- javascript - Vue.js this.$nextTick() 似乎没有等待 dom 渲染
- python - 如何在python中创建一个zip文件
- docusignapi - 发送信封时认证失败
- html - 使网格列适应其内容