2012-10-04 56 views
47

Tôi muốn tạo một loại lớp tiện ích chỉ chứa các phương thức tĩnh có thể gọi bằng tiền tố lớp tên. Hình như tôi đang làm điều gì sai :)Phương thức tĩnh lớp Python

Đây là lớp học nhỏ của tôi:

class FileUtility(): 

    @staticmethod 
    def GetFileSize(self, fullName): 
     fileSize = os.path.getsize(fullName) 
     return fileSize 

    @staticmethod 
    def GetFilePath(self, fullName): 
     filePath = os.path.abspath(fullName) 
     return filePath 

Bây giờ tôi phương pháp "chính":

from FileUtility import * 
def main(): 
     path = 'C:\config_file_list.txt' 
     dir = FileUtility.GetFilePath(path) 
     print dir 

và tôi đã nhận một lỗi: unbound method GetFilePath() must be called with FileUtility instance as first argument (got str instance instead).

A có một số câu hỏi ở đây:

  1. Tôi đang làm gì sai? Không nên gọi phương thức tĩnh bằng tên lớp?
  2. Tôi có thực sự cần một lớp tiện ích, hoặc có cách nào khác để đạt được điều tương tự trong Python không?
  3. Nếu tôi cố gắng thay đổi mã trong chính tôi nhận được: TypeError: GetFilePath() takes exactly 1 argument (2 given)

mới main:

from FileUtility import * 
def main(): 
    objFile = FileUtility() 
    path = 'H:\config_file_list.txt' 
    dir = objFile.GetFilePath(path) 
    print dir 

Trả lời

82

Bạn đang gặp lỗi bởi vì bạn đang tham gia một lập luận self trong mỗi của những chức năng. Chúng tĩnh, bạn không cần nó.

Tuy nhiên, cách 'bắt chước' để làm điều này không phải là có một lớp đầy đủ các phương pháp tĩnh, mà chỉ để làm cho chúng hoạt động miễn phí trong một mô-đun.

#fileutility.py: 

def get_file_size(fullName): 
    fileSize = os.path.getsize(fullName) 
    return fileSize 


def get_file_path(fullName): 
    filePath = os.path.abspath(fullName) 
    return filePath 

Bây giờ, trong file python khác của bạn (giả sử fileutility.py là trong cùng thư mục hoặc trên PYTHONPATH)

import fileutility 

fileutility.get_file_size("myfile.txt") 
fileutility.get_file_path("that.txt") 

Nó không đề cập đến phương pháp tĩnh cụ thể, nhưng nếu bạn đến từ một ngôn ngữ khác, PEP 8, hướng dẫn phong cách python là một đọc tốt và giới thiệu về cách lập trình python nghĩ.

+0

Hi Collin, cảm ơn bạn đã trả lời, tôi đã làm như bạn đề nghị, file python đơn giản với danh sách các phương pháp và trong chính: dir = FileUtility.GetFilePath (đường dẫn) Tôi nhận được một lỗi: phương pháp unbound GetFilePath() phải được gọi với dụ FileUtility như là đối số đầu tiên (có str instance thay vì) – ilyaw77

+0

Xin lỗi, để lại một tự lạc trong đó trong lần chạy đầu tiên. Bạn vẫn có một lớp FileUtility ở đâu đó? – Collin

+1

Vấn đề là bạn không nên có lớp FileUtility. Cũng giống như bạn có thể viết các hàm miễn phí trong C++, bạn nên làm tương tự ở đây. Tên mô-đun (bản đồ cho các tệp) cũng phải là tất cả các chữ thường. – Collin

8

Bạn thực sự không nên tạo ra phương pháp tĩnh trong Python. Những gì bạn cần làm là đặt chúng ở cấp độ chức năng toàn cầu, và sau đó truy cập vào các mô-đun họ đang ở trong khi bạn gọi cho họ.

foo.py:

def bar(): 
    return 42 

baz.py:

import foo 
print foo.bar() 
4

Trong python, java-like (hoặc bất kỳ) static phương pháp không được sử dụng rộng rãi như họ không thực sự có một mục đích.

Thay vào đó, bạn chỉ cần xác định "phương pháp" của bạn như chức năng trong một module:

#module1.py 
def fun1(): 
    return do_stuff() 
def fun2(arg): 
    return do_stuff_with_arg(arg) 

#main.py 
import module1 
if __name__ == '__main__': 
    a = module1.fun() 
    print module1.fun2(a) 
6

phương pháp tĩnh không nhận được các đối tượng thông qua tại như các tham số đầu tiên (không có đối tượng)

loại bỏ các tham số self và các cuộc gọi sẽ làm việc. Vấn đề nhập cũng có liên quan. Và nhận xét tĩnh cũng có liên quan.

1

Nếu bạn muốn sử dụng các hàm được xác định trong lớp, bạn chỉ cần tạo một thể hiện của lớp của bạn và áp dụng hàm đó.

Vì vậy, kết quả là:

dir = FileUtility().GetFilePath(path) 

Chỉ cần thêm() sau tên lớp học của bạn.

@staticmethod không cần thiết vì bạn đang sử dụng hàm chuẩn, không phải tĩnh. Nhưng trong trường hợp của bạn kết quả là như nhau.

2

Chỉ cần xóa self trong định nghĩa phương thức. Mục đích của bạn là sử dụng tĩnh. Tự làm việc với cá thể của lớp đó.

0

Chỉ cần xóa tự trong định nghĩa chức năng. Vì bạn đang sử dụng các hàm tĩnh nên bạn không cần phải tự bỏ qua đối số cho các hàm. Vì vậy, lớp học và chức năng của bạn nên được như thế này:

class FileUtility(): 

    @staticmethod 
    def GetFileSize(fullName): 
     fileSize = os.path.getsize(fullName) 
     return fileSize 

    @staticmethod 
    def GetFilePath(fullName): 
     filePath = os.path.abspath(fullName) 
     return filePath 
Các vấn đề liên quan