2011-11-01 62 views
8

EDIT2: Cảm ơn tất cả vì sự giúp đỡ của bạn! EDIT: khi thêm @staticmethod, nó hoạt động. Tuy nhiên tôi vẫn tự hỏi tại sao tôi nhận được một loại lỗi ở đây.gọi hàm từ lớp trong python - cách khác

Tôi vừa mới bắt đầu OOPS và hoàn toàn mới với nó. Tôi có một câu hỏi rất cơ bản về những cách khác nhau mà tôi có thể gọi một hàm từ một lớp. Tôi có một tập tin testClass.py với mã:

class MathsOperations: 
    def __init__ (self, x, y): 
     self.a = x 
     self.b = y 
    def testAddition (self): 
     return (self.a + self.b) 

    def testMultiplication (self): 
     return (self.a * self.b) 

tôi kêu gọi lớp này từ một tập tin gọi là main.py với đoạn mã sau:

from testClass import MathsOperations 

xyz = MathsOperations(2, 3) 
print xyz.testAddition() 

này hoạt động mà không cần bất kỳ vấn đề. Tuy nhiên, tôi muốn sử dụng lớp theo cách đơn giản hơn nhiều.

Tôi hiện đã đặt mã sau vào tệp testClass.py. Tôi đã bỏ chức năng init lần này.

class MathsOperations: 
    def testAddition (x, y): 
     return x + y 

    def testMultiplication (a, b): 
     return a * b 

gọi điều này bằng cách sử dụng;

from testClass import MathsOperations 
xyz = MathsOperations() 
print xyz.testAddition(2, 3) 

tính năng này không hoạt động. Ai đó có thể giải thích những gì đang xảy ra sai trong trường hợp 2? Làm thế nào để sử dụng lớp học này?

Các lỗi tôi nhận được là "Lỗi Loại: testAddition() có chính xác 2 đối số (3 nhất định)"

Trả lời

14

bạn phải sử dụng tự như thông số đầu tiên của phương thức

trong trường hợp thứ hai, bạn nên sử dụng

class MathOperations: 
    def testAddition (self,x, y): 
     return x + y 

    def testMultiplication (self,a, b): 
     return a * b 

và trong mã của bạn, bạn có thể làm như sau

tmp = MathOperations 
print tmp.testAddition(2,3) 

nếu bạn sử dụng lớp mà không instantiating một biến đầu tiên

print MathOperation.testAddtion(2,3) 

nó mang lại cho bạn một thông báo lỗi "Lỗi Loại: phương pháp không ràng buộc"

nếu bạn muốn làm điều đó, bạn sẽ cần trang trí @staticmethod

Ví dụ:

class MathsOperations: 
    @staticmethod 
    def testAddition (x, y): 
     return x + y 

    @staticmethod 
    def testMultiplication (a, b): 
     return a * b 

sau đó trong mã của bạn, bạn có thể sử dụng

print MathsOperations.testAddition(2,3) 
+0

vì vậy thẻ @staticmethod tự động đặt trong tham số tự? –

+0

nếu bạn sử dụng @staticmethod, bạn có thể sử dụng lớp mà không khai báo biến đầu tiên chẳng hạn, trong trường hợp này nếu bạn cố gắng sử dụng MathOperation.testAddtion (2,3), nó cung cấp cho bạn lỗi "TypeError: unbound method" –

+2

Không, trình trang trí staticmethod loại bỏ sự cần thiết cho tham số tự. –

1

Bạn cần có một thể hiện của một lớp học để sử dụng phương pháp của nó. Hoặc nếu bạn không cần truy cập vào bất kỳ biến nào của các lớp (không phải các tham số tĩnh) thì bạn có thể định nghĩa phương thức đó là tĩnh và nó có thể được sử dụng ngay cả khi lớp đó không được khởi tạo. Chỉ cần thêm @staticmethod trang trí cho các phương pháp của bạn.

class MathsOperations: 
    @staticmethod 
    def testAddition (x, y): 
     return x + y 
    @staticmethod 
    def testMultiplication (a, b): 
     return a * b 

tài liệu: http://docs.python.org/library/functions.html#staticmethod

+0

Tôi đã chỉnh sửa câu hỏi một chút. xin lỗi về nó. –

+0

@RishavSharan Không có vấn đề gì, các câu trả lời khác đã đề cập đến đối số 'self' bị thiếu. Nhưng tôi vẫn sẽ sử dụng các phương thức tĩnh nếu bạn không cần phải làm việc với các tham số lớp. – rplnt

2

phương pháp của bạn không đề cập đến một đối tượng (có nghĩa là, tự), vì vậy bạn nên sử dụng @staticmethod decorator:

class MathsOperations: 
    @staticmethod 
    def testAddition (x, y): 
     return x + y 

    @staticmethod 
    def testMultiplication (a, b): 
     return a * b 
+0

Tôi đang chỉnh sửa câu hỏi. bạn có thể vui lòng giải thích các typeerror ở đó? tôi đang đưa ra hai đối số onlts nhưng nó nói 3 đối số. –

7

từ chối trách nhiệm: đây không phải là chỉ để câu trả lời điểm, nó giống như một lời khuyên, ngay cả khi câu trả lời có thể được tìm thấy trên các tài liệu tham khảo

IMHO: lập trình hướng đối tượng trong Python khá nhiều.

Phương thức gửi đi không phải là rất đơn giản, bạn cần biết về các phương thức ràng buộc/ràng buộc/lớp (và tĩnh!); bạn có thể có nhiều thừa kế và cần phải đối phó với các lớp phong cách cũ và mới (của bạn là kiểu cũ) và biết cách MRO hoạt động, các thuộc tính ...

Tóm lại: quá phức tạp, với nhiều điều xảy ra dưới mui xe . Hãy để tôi thậm chí nói, nó là unpythonic, vì có rất nhiều cách khác nhau để đạt được những điều tương tự.

Lời khuyên của tôi: chỉ sử dụng OOP khi nó thực sự hữu ích. Thông thường, điều này có nghĩa là viết các lớp thực hiện các giao thức nổi tiếng và tích hợp liền mạch với phần còn lại của hệ thống. Không tạo nhiều lớp chỉ vì mục đích viết mã hướng đối tượng.

Hãy đọc tốt để trang này:

bạn sẽ tìm thấy chúng khá hữu ích.

Nếu bạn thực sự muốn học OOP, tôi khuyên bạn nên bắt đầu bằng một ngôn ngữ thông thường hơn, như Java. Nó không phải là một nửa vui vẻ như Python, nhưng nó có thể dự đoán được hơn.

+0

cảm ơn. Tôi sẽ xem các trang. –

+0

bạn được chào đón! bằng cách này, câu trả lời thẳng là bạn nhận được lỗi vì thông dịch viên thêm tham số 'self' cho các phương thức liên kết, vì vậy bạn kết thúc với ba (' self' cộng với hai số nguyên được cung cấp). – fortran

+0

ah! lời giải thích đó có ý nghĩa. Tôi thường mệt mỏi về tài liệu python gốc vì chúng không thân thiện với người mới, thích sử dụng các trang web như "một byte python". –

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