【问题标题】:Can a class and a function have a common name in Python?Python中的类和函数可以有一个共同的名字吗?
【发布时间】:2017-12-11 15:31:08
【问题描述】:

看起来有一个函数以及一个与名称 cv2.VideoCapture 关联的类。

一个类和一个函数可以共用一个名字吗?

我的猜测是,此时 cv2.VideoCapture 代表一个类和一个函数。

>>>import cv2

>>>print(cv2.VideoCapture)
<built-in function VideoCapture>  

>>>camera = cv2.VideoCapture(0)  
>>>print(type(camera))
<class 'cv2.VideoCapture'>  

【问题讨论】:

  • 函数不能返回类吗?
  • 确实可以。但是,它会打印一个与函数同名的类。我期待一个具有不同名称的类

标签: python class oop


【解决方案1】:

一切都取决于你所谓的“名字”......

>>> class Foo(object):
...     pass
... 
>>> _Foo = Foo
>>> def Foo():
...     return _Foo()
... 
>>> f = Foo()
>>> print(Foo)
<function Foo at 0x7f74a5fec8c0>
>>> print(type(f))
<class '__main__.Foo'>
>>> 

如您所见,这里有一个公开为Foo 的函数并且它是__name__ == "Foo",以及一个公开为_Foo 但具有__name__ 的类== “Foo”也是。

回答您的问题:在给定命名空间中的给定时间,您不能将同名(=> 变量)绑定到多个对象。但是您可以拥有许多对象,是否希望 .__name__ 属性具有相同的值。

【讨论】:

  • 无论如何我对你的回答很满意,而且很清楚。但我没有看到在一个 python 模块(在本例中为 cv2)中为一个类和一个函数使用一个名称的优势..
【解决方案2】:

我没有检查OpenCV 源代码来检查在这种特定情况下发生了什么或为什么会发生,但理论上如果你的函数返回一个具有相同名称的类的实例,这是可能的。

考虑包含以下内容的文件 cv2.py

def VideoCapture(_):
    class VideoCapture(object):
        pass
    return VideoCapture()

用法:

>>> import cv2
>>> cv2.VideoCapture
<function VideoCapture at 0x7f70d36069b0>
>>> 
>>> camera = cv2.VideoCapture(0)
>>> type(camera)
<class 'cv2.VideoCapture'>

【讨论】:

    猜你喜欢
    • 2013-07-05
    • 2014-02-28
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    相关资源
    最近更新 更多