2017-12-11 10 views
4

cv2.VideoCaptureという名前に関連付けられているクラスと同様、機能があるようです。Pythonでクラスと関数が共通の名前を持つことはできますか?

共通名を共有するクラスと関数は可能ですか?

私の推測では、この時点では、cv2.VideoCaptureもクラスと関数を表しています。

>>>import cv2 

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

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

は、関数がクラスを返すことができませんでしたか? – Sraw

+1

それは確かに可能です。ただし、関数と同じ名前のクラスを出力します。私は別の名前を持つクラスを期待しています – skilledDt

+0

'OpenCV'は、やはり – Georgy

答えて

5

すべては、あなたが「名前」と呼んでいるものに依存し...

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

あなたが見ることができるように、ここであなたはそれが__name__ ==「foo」というのです持つFooとして公開されている関数を持っています_Fooとして公開されていますが、__name__ == "Foo"のクラスもあります。

あなたの質問に答えてください:指定された名前空間では、指定された時間に複数のオブジェクトに同じ名前(=>変数)をバインドすることはできません。しかし、.__name__属性に同じ値を設定したいと思っているオブジェクトがたくさんあることがあります。

+0

という方法でC++で書かれていますが、とにかく私はあなたの答えに満足していて、それは明らかです。しかし、私は1つのPythonモジュール(ここではcv2)でクラスと関数に1つの名前を使用する利点はありません。 – skilledDt

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'> 
関連する問題