2013-05-27 30 views
24

Tôi có một nền tảng công bằng trong java, cố gắng tìm hiểu python. Tôi đang gặp sự cố khi hiểu cách truy cập các phương thức từ các lớp khác khi chúng ở các tệp khác nhau. Tôi tiếp tục nhận được đối tượng mô-đun là không thể gọi.'mô-đun' đối tượng không gọi được - phương pháp gọi trong tập tin khác

Tôi đã thực hiện một hàm đơn giản để tìm số nguyên lớn nhất và nhỏ nhất trong danh sách trong một tệp và muốn truy cập các hàm đó trong một lớp khác trong tệp khác.

Bất kỳ trợ giúp nào được đánh giá cao, cảm ơn.

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

Python không phải là Java. Không có mã nào trong số này có bất kỳ lý do gì để ở trong một lớp học. Đặt chúng thành các hàm mức module. –

+0

Trong một chương trình python phức tạp hơn, tôi sẽ không cần tất cả các phương pháp của tôi được tổ chức trong các lớp học, tôi vẫn nghĩ java, nhờ sự giúp đỡ. –

+5

Không, bạn sẽ cần một số lớp, nhưng có thể bạn sẽ cần các hàm đơn giản. – Elazar

Trả lời

49

Vấn đề là trong dòng import. bạn đang nhập một mô-đun , không phải là một lớp học. giả sử tập tin của bạn được đặt tên other_file.py (không giống như java, một lần nữa, không có nguyên tắc "một lớp, một tập tin"):

from other_file import findTheRange 

nếu tập tin của bạn được đặt tên findTheRange quá, sau convenions java, sau đó bạn nên viết

from findTheRange import findTheRange 

bạn cũng có thể nhập nó giống như bạn đã làm với random:

import findTheRange 
operator = findTheRange.findTheRange() 

Một số nhận xét khác:

a) @Daniel Roseman là đúng. Bạn không cần lớp học ở đây cả. Python khuyến khích lập trình thủ tục (khi nó phù hợp, tất nhiên)

b) Bạn có thể xây dựng danh sách trực tiếp:

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

c) Bạn có thể gọi các phương thức trong cùng một cách bạn làm trong java:

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

d) bạn có thể sử dụng được xây dựng trong chức năng, và thư viện trăn khổng lồ:

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

e) Nếu bạn st ốm muốn sử dụng một lớp, và bạn không cần phải self, bạn có thể sử dụng @staticmethod:

class findTheRange(): 
    @staticmethod 
    def findLargest(_list): 
     #stuff... 
+1

Hai dòng này giống hệt mã của OP. Việc nhập thay đổi sẽ khắc phục lỗi, nhưng việc sử dụng tên tệp OP (và giải thích sự dư thừa rõ ràng) có thể hữu ích. – delnan

+0

chúng không * giống hệt nhau * - đó là một cuộc gọi động thay vì một cuộc gọi tĩnh. (hãy sửa tôi nếu tôi sai) – Elazar

+0

và tôi không * biết * tên tệp OP là gì - tôi chỉ đoán nó thực sự là 'findTheRange', vì đó là quy ước trong Java. dù sao, bạn được chào đón để cải thiện câu trả lời của tôi. – Elazar

1

tôi muốn chia sẻ một số loại trái cây từ kinh nghiệm của tôi, với những người có thể có những nghi ngờ như vậy.

  • from một directory_of_modules, bạn có thể import một specific_module.py
  • specific_module.py này, có thể chứa một Class với some_methods() hoặc chỉ functions()
  • từ một specific_module.py, bạn có thể nhanh chóng một Class hoặc gọi functions()
  • từ này Class, bạn có thể thực hiện some_method()

Ví dụ:

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

Điều quan trọng cần lưu ý PEP 8 - Style Guide for Python Code, trong đó mô tả khái niệm đó sẽ tránh được những vấn đề xảy ra như thế nào trong câu hỏi này: it will keep the order over the files of your application and it will give a better visibility of what exactly is being imported.

Modules nên có ngắn và tất cả tên -owercase.

Lưu ý: Dấu gạch dưới có thể được sử dụng trong tên mô-đun nếu nó cải thiện khả năng đọc.

Một Python mô-đun chỉ đơn giản là một tập tin nguồn (* py.), Có thể phơi bày:

  • Class: tên sử dụng "CapWords" ước.

  • Chức năng: tên bằng chữ thường, các từ được phân tách bằng dấu gạch dưới.

  • Biến toàn cục: các quy ước giống như các chức năng cho các chức năng.

Các vấn đề liên quan