2013-09-08 67 views
14

Vì vậy, tôi mới bắt đầu lập trình bằng python và tôi không hiểu toàn bộ lý do đằng sau 'tự'. Tôi hiểu rằng nó được sử dụng gần giống như một biến toàn cầu, để dữ liệu có thể được truyền giữa các phương thức khác nhau trong lớp. Tôi không hiểu tại sao bạn cần sử dụng nó khi bạn gọi một phương pháp khác trong cùng một lớp. Nếu tôi đã ở trong lớp đó, tại sao tôi phải nói với nó?Phương thức gọi Python mà không cần 'tự'

ví dụ, nếu tôi có: Tại sao tôi cần self.thing()?

class bla: 
    def hello(self): 
     self.thing() 

    def thing(self): 
     print "hello" 
+4

Mở trình thông dịch Python và chạy 'nhập này 'để có giải thích về hầu hết các quyết định ngôn ngữ của Python. –

+1

@ColinValliant: Những câu nói giáo lý ít người biết đến và linh hoạt như "* Bây giờ là tốt hơn bao giờ hết. Mặc dù không bao giờ thường tốt hơn * ngay bây giờ.* "chỉ có thể được giải thích bởi một Pythoness khai ngộ và không thực sự giúp trả lời câu hỏi. – mins

Trả lời

9

Một lý do là để tham khảo các phương pháp sơ thẩm mà đặc biệt lớp của trong đó mã được được thực thi.

Ví dụ này có thể giúp:

def hello(): 
    print "global hello" 

class bla: 
    def hello(self): 
     self.thing() 
     hello() 

    def thing(self): 
     print "hello" 

b = bla() 
b.hello() 
>>> hello 
global hello 

Bạn có thể nghĩ về nó, bây giờ, để được độ phân giải không gian tên.

0

Có thể có một chức năng khác có cùng tên bên ngoài lớp học của bạn. self là một tham chiếu đối tượng cho chính đối tượng, do đó, chúng giống nhau. Phương thức Python không được gọi trong ngữ cảnh của đối tượng. self trong Python có thể được sử dụng để đối phó với các mô hình đối tượng tùy chỉnh hoặc một cái gì đó.

1

Câu trả lời ngắn gọn là "bởi vì bạn có thể def thing(args) như một chức năng toàn cầu, hoặc như là một phương pháp của lớp khác Đi này (khủng khiếp) ví dụ:..

def thing(args): 
    print "Please don't do this." 

class foo: 
    def thing(self,args): 
     print "No, really. Don't ever do this." 

class bar: 
    def thing(self,args): 
     print "This is completely unrelated." 

này là xấu Đừng làm điều này. . nhưng nếu bạn đã, bạn có thể gọi thing(args)một cái gì đó sẽ xảy ra này có khả năng có thể là một điều tốt nếu bạn có kế hoạch cho phù hợp:

class Person: 
    def bio(self): 
     print "I'm a person!" 

class Student(Person): 
    def bio(self): 
     Person.bio(self) 
     print "I'm studying %s" % self.major 

T ông trên mã làm cho nó để nếu bạn tạo một đối tượng của lớp Student và gọi bio, nó sẽ làm tất cả những thứ mà sẽ xảy ra nếu nó là của lớp Person rằng đã có riêng bio nó được gọi là nó sẽ làm nó điều sau đó.

Điều này được thừa hưởng và một số nội dung khác mà bạn có thể chưa thấy, nhưng mong chờ điều đó.

11

Bạn cũng có thể thực hiện các phương thức trong lớp static vì vậy không cần self. Tuy nhiên, sử dụng điều này nếu bạn thực sự cần điều đó.

Yours:

class bla: 
    def hello(self): 
     self.thing() 

    def thing(self): 
     print "hello" 

phiên bản tĩnh:

class bla: 
    @staticmethod 
    def hello(): 
     bla.thing() 

    @staticmethod 
    def thing(): 
     print "hello" 
+1

Tôi biết đây là một bài đăng cũ hơn, nhưng bạn có nhớ đưa ra một ví dụ về một kịch bản mà trong đó người ta sẽ sử dụng một phương pháp tĩnh? – uitty400

0

Đối với tôi, tự giống như một DEFINER phạm vi, với self.foo() và self.bar ghi rõ chức năng và các thông số quy định tại các lớp học và không phải là những định nghĩa ở những nơi khác.