45

我在java方面有相当的背景,正在尝试学习python。当其他类位于不同的文件中时,我在理解如何访问其他类的方法时遇到了问题。我不断收到模块对象不可调用。

我做了一个简单的函数来查找一个文件的列表中的最大和最小整数,并希望在另一个文件的另一个类中访问这些函数。

任何帮助表示赞赏,谢谢。

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' )
4

2 回答 2

81

问题出在import一线。您正在导入一个模块,而不是一个类。假设您的文件已命名other_file.py(与 java 不同,同样没有“一个类,一个文件”这样的规则):

from other_file import findTheRange

如果您的文件也按照 java 的约定命名为 findTheRange,那么您应该编写

from findTheRange import findTheRange

你也可以像你一样导入它random

import findTheRange
operator = findTheRange.findTheRange()

其他一些评论:

a)@Daniel Roseman 是对的。你根本不需要在这里上课。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...
于 2013-05-27T21:06:19.043 回答
3
  • from一个directory_of_modules,你import可以specific_module.py
  • this specific_module.py,可以包含一个Classwithsome_methods()或 justfunctions()
  • 从 a specific_module.py,您可以实例化 aClass或调用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”约定的名称。

  • 功能:小写名称,下划线分隔的单词。

  • 全局变量:约定与函数的约定大致相同。

于 2017-10-04T21:08:19.617 回答