web-dev-qa-db-ja.com

「モジュール」オブジェクトは呼び出し可能ではありません-別のファイルのメソッドを呼び出しています

私は、Pythonを学ぼうとしているJavaのかなりのバックグラウンドを持っています。別のファイルにある他のクラスのメソッドにアクセスする方法を理解する際に問題が発生しています。モジュールオブジェクトが呼び出し可能でないことを取得し続けます。

1つのファイルのリストで最大および最小の整数を見つけるために、別のファイルの別のクラスのそれらの関数にアクセスする簡単な関数を作成しました。

どんな助けも感謝します、ありがとう。

class findTheRange():

    def findLargest(self, _list):
        candidate = _list[0]
        for i in _list:
            if i > candidate:
                candidate = i
        return candidate

    def findSmallest(self, _list):
        candidate = _list[0]
        for i in _list:
            if i < candidate:
                candidate = i
        return candidate

 import random
 import findTheRange

 class Driver():
      numberOne = random.randint(0, 100)
      numberTwo = random.randint(0,100)
      numberThree = random.randint(0,100)
      numberFour = random.randint(0,100)
      numberFive = random.randint(0,100)
      randomList = [numberOne, numberTwo, numberThree, numberFour, numberFive]
      operator = findTheRange()
      largestInList = findTheRange.findLargest(operator, randomList)
      smallestInList = findTheRange.findSmallest(operator, randomList)
      print(largestInList, 'is the largest number in the list', smallestInList, 'is the                smallest number in the list' )
39

問題はimport行にあります。クラスではなくモジュールをインポートしています。ファイルの名前がother_file.pyであると仮定します(Javaとは異なり、「1つのクラス、1つのファイル」などのルールはありません)。

from other_file import findTheRange

ファイルの名前がfindTheRangeであり、Javaの慣習に従っている場合は、

from findTheRange import findTheRange

randomで行ったようにインポートすることもできます:

import findTheRange
operator = findTheRange.findTheRange()

他のコメント:

a)@ダニエル・ローズマンは正しい。ここではクラスはまったく必要ありません。 Pythonは手続き型プログラミングを奨励します(もちろん適合する場合)

b)リストを直接作成できます:

  randomList = [random.randint(0, 100) for i in range(5)]

c)Javaで行うのと同じ方法でメソッドを呼び出すことができます。

largestInList = operator.findLargest(randomList)
smallestInList = operator.findSmallest(randomList)

d)組み込み関数と巨大なpythonライブラリを使用できます:

largestInList = max(randomList)
smallestInList = min(randomList)

e)クラスを引き続き使用する必要があり、selfが必要ない場合は、@staticmethodを使用できます。

class findTheRange():
    @staticmethod
    def findLargest(_list):
        #stuff...
70
Elazar
  • from a directory_of_modules、次のことができますimport a specific_module.py
  • このspecific_module.pyには、some_methods()またはfunctions()と一緒にClassを含めることができます
  • specific_module.pyから、Classをインスタンス化するか、functions()を呼び出すことができます
  • このClassから、some_method()を実行できます

例:

#!/usr/bin/python3
from directory_of_modules import specific_module
instance = specific_module.DbConnect("username","password")
instance.login()

PEP 8-Pythonコードのスタイルガイド からの抜粋:

モジュールには、すべて小文字の短い名前を付ける必要があります。

注意:読みやすさを改善する場合は、モジュール名にアンダースコアを使用できます。

Pythonモジュールは、ソースファイル(* .py)であり、次のものを公開できます。

  • クラス:「CapWords」規則を使用した名前。

  • 機能:小文字の名前、アンダースコアで区切られた単語。

  • グローバル変数:規則は、関数の規則とほぼ同じです。

2
ivanleoncz