Pythonのsocket通信のfromとimportについて


Pythonのfromとimportの使い方について質問です。

[code]

    from socket import socket
    socket.gethostbyname(socket.gethostname())
    
[/code]

だとエラーになって  
AttributeError: type object 'socket' has no attribute 'gethostbyname'  
というメッセージが出ます。

[code]

    import socket
    socket.gethostbyname(socket.gethostname())
    
[/code]

だとエラーにならないのは何故でしょうか？  
`from socket import socket`の部分を残したまま、エラーを出さないコードにするにはどうすれば良いですか？



[code]

    from socket import socket
    
[/code]

これは、socketモジュールにあるsocketオブジェクト（この場合は関数オブジェクト）を現在の名前空間に取り込んでいます。  
以下と同義です

[code]

    import socket
    socket = socket.socket
    
[/code]

`socket.gethostbyname()` は socketモジュールにある `gethostbyname`
関数オブジェクトを呼び出すことを意図したコードです。このため、 `from socket import socket`
と書いてしまうと、現在の名前空間にあるのは
socketモジュールではなく、socket関数オブジェクトのため、「socket関数オブジェクトにgethostbyname属性がない」というエラーになります。

[code]

    AttributeError: type object 'socket' has no attribute 'gethostbyname'
    
[/code]

それがこのエラーです。

> `from socket import socket` の部分を残したまま、エラーを出さないコードにするにはどうすれば良いですか？

以下の様に書くことが出来ます

[code]

    from socket import gethostbyname, gethostname
    gethostbyname(gethostname())
    
[/code]



[code]

    from socket import socket
    
[/code]

これは、socketモジュールにあるsocketオブジェクト（この場合は関数オブジェクト）を現在の名前空間に取り込んでいます。  
以下と同義です

[code]

    import socket
    socket = socket.socket
    
[/code]

`socket.gethostbyname()` は socketモジュールにある `gethostbyname`
関数オブジェクトを呼び出すことを意図したコードです。このため、 `from socket import socket`
と書いてしまうと、現在の名前空間にあるのは
socketモジュールではなく、socket関数オブジェクトのため、「socket関数オブジェクトにgethostbyname属性がない」というエラーになります。

[code]

    AttributeError: type object 'socket' has no attribute 'gethostbyname'
    
[/code]

それがこのエラーです。

> `from socket import socket` の部分を残したまま、エラーを出さないコードにするにはどうすれば良いですか？

以下の様に書くことが出来ます

[code]

    from socket import gethostbyname, gethostname
    gethostbyname(gethostname())
    
[/code]

