2011-02-04 33 views
5

Tôi đã đoạn mã sau:Tại sao tôi không thể gọi phương thức riêng tư khi tôi ở trong một phương thức công khai?

class MyClass: 
    def __private(self): 
     print "Hey man! This is private!" 

    def public(self): 
     __private() 
     print "I don't care if you see this!" 

if __name__ == '__main__': 
    x = MyClass() 
    x.public() 

Tuy nhiên nó mang lại cho tôi những lỗi sau:

NameError: global name '_MyClass__private' is not defined

Tôi đang làm gì sai?

+3

Ngoài ra, nếu bạn chưa sẵn sàng, đọc phần này của tài liệu: http://docs.python.org/tutorial/classes.html#private-variables Dấu gạch dưới đơn là quy ước điển hình cho các biến "riêng tư". Bạn thường chỉ sử dụng dấu gạch dưới kép khi bạn muốn tránh xung đột tên trong các lớp kế thừa từ 'MyClass' của bạn. Dấu gạch dưới kép sẽ gọi tên mangling, có thể là những gì bạn muốn ở đây, nhưng tôi muốn đảm bảo rằng bạn biết nó ... –

+1

Vui lòng không sử dụng '__'. Nó được dành riêng cho "mangling tên", một điều Python làm nội bộ để đảm bảo rằng tên nội bộ không bao giờ va chạm. –

Trả lời

20

Bạn cần self:

self.__private() 

Lớp học trong python lấy làm quen với nếu bạn đang đến từ C#/C++/Java, giống như nó trông giống như bạn đang có. Điều này có thể gây ra "cách" của từ ngữ, nhưng bạn có thể nghĩ về nó như thế này (nó đã giúp tôi):

Mỗi lớp xác định một không gian tên được định nghĩa trong chính nó là self và không có tên một thể hiện của lớp đó. Những điều "riêng tư" với hai dấu gạch dưới bị xâu chuỗi để từ đó bạn không cần phải gọi nó bằng tên đặc biệt, nhưng từ bên trong bạn có thể chỉ cần sử dụng .

Như Joe đã đề cập trong bình luận của mình, các biến riêng thường chỉ được đặt tên với một dấu gạch dưới, dấu gạch dưới kép mang nó để thừa kế có thể làm việc mà không có xung đột tên trong các lớp con. Không có thực thi quyền riêng tư trong python, nó hoàn toàn là quy ước nói rằng bạn không thể sử dụng một biến riêng từ bên ngoài lớp.

Như Thomas đã đề cập, self cũng là một quy ước. Đối với phương pháp nào (một chức năng tuyên bố như là một phần của một lớp) các trường hợp mà phương pháp này đang được kêu gọi là tham số đầu tiên được thông qua năm Bạn có thể chỉ là một cách dễ dàng làm được điều này:.

def __private(randomText): 
    print "Hey man! This is private!" 

def public(otherRandomText): 
    otherRandomText.__private() 
    print "I don't care if you see this!" 

Tuy nhiên, nếu bạn làm điều đó tinh thần logic và phong cách lập trình tốt sẽ ám ảnh bạn và hậu duệ của bạn mãi mãi. (self là thích hợp hơn nhiều).

Bất kỳ pythonistas nào muốn sửa/giải thích thêm?

+0

Và bây giờ tôi cảm thấy như một thằng ngốc. Cảm ơn! –

+2

Đừng lo lắng về nó! Tôi không thể nói với bạn bao nhiêu lần tôi đã làm điều đó. Nó có thể sẽ tiếp tục xảy ra bất cứ khi nào bạn chuyển đổi giữa các ngôn ngữ. – Crisfole

+2

@Bob @Cpfohl Yup, cũng bắt tôi mỗi lần trong PHP, chỉ vì tôi đã dành rất nhiều năm để làm C++ ... –

3

Mã của bạn như là đang cố gắng để gọi một chức năng MyCalls tĩnh .__ tin, bạn muốn làm điều này:

class MyClass: 
    def __private(self): 
     print "Hey man! This is private!" 

    def public(self): 
     self.__private() 
     print "I don't care if you see this!" 

if __name__ == '__main__': 
    x = MyClass() 
    x.public() 
Các vấn đề liên quan