2012-07-10 16 views
22

Tôi đã ngồi suốt cả ngày và Im hơi mệt rồi nên xin lỗi vì ngắn gọn.Truyền các biến, tạo ra các cá thể, tự, Cơ học và cách sử dụng các lớp: cần giải thích

Im new to python.

Tôi vừa viết lại một chương trình làm việc, thành một loạt các chức năng trong một lớp và mọi thứ đã sai lệch. Tôi không biết nếu đó là tôi nhưng tôi rất ngạc nhiên tôi không thể tìm thấy một hướng dẫn cho người mới bắt đầu về cách xử lý các lớp học trên web vì vậy tôi có một vài câu hỏi.

Đầu tiên của tất cả, trong phần __init__ của lớp tôi đã khai báo một loạt các biến với self.variable=something.

Tôi có thể truy cập/sửa đổi các biến này trong mọi chức năng của lớp bằng cách sử dụng self.variable trong hàm đó không? Nói cách khác, bằng cách tuyên bố self.variable Tôi đã thực hiện các biến này, các biến toàn cầu trong phạm vi của lớp phải không?

Nếu không, làm thế nào để tôi tự xử lý?

Thứ hai, làm cách nào để chuyển chính xác đối số cho lớp học? Một số mã ví dụ sẽ được mát mẻ.

Thứ ba, làm cách nào để gọi hàm của lớp bên ngoài phạm vi lớp học? Một số mã ví dụ sẽ được mát mẻ.

Fouthly, làm thế nào để tạo ra một Instance của class INITIALCLASS trong class OTHERCLASS khác, đi qua các biến từ OTHERCLASS để INITIALCLASS? Một số mã ví dụ sẽ được mát mẻ.

Tôi muốn gọi hàm từ OTHERCLASS với các đối số từ INITIALCLASS. Những gì tôi đã làm cho đến nay là.

class OTHERCLASS(): 
    def __init__(self,variable1,variable2,variable3): 
     self.variable1=variable1 
     self.variable2=variable2 
     self.variable3=variable3 
    def someotherfunction(self): 
     something=somecode(using self.variable3) 
     self.variable2.append(something) 
     print self.variable2 
    def somemorefunctions(self): 
     self.variable2.append(variable1) 

class INITIALCLASS(): 
    def __init__(self): 
     self.variable1=value1 
     self.variable2=[] 
     self.variable3='' 
     self.DoIt=OTHERCLASS(variable1,variable2,variable3) 

    def somefunction(self): 
     variable3=Somecode 
     #tried this 
     self.DoIt.someotherfunctions() 
     #and this 
     DoIt.someotherfunctions() 

Tôi rõ ràng không hiểu cách chuyển biến cho lớp hoặc cách xử lý self, khi nào cần sử dụng và khi nào không. Tôi có lẽ cũng không hiểu làm thế nào để đúng cách tạo ra một thể hiện của một lớp học. Nói chung tôi không hiểu cơ chế của lớp học, vì vậy hãy giúp tôi và giải thích cho tôi như tôi không có ý tưởng (mà tôi không, có vẻ như). Hoặc chỉ cho tôi một video toàn diện hoặc hướng dẫn có thể đọc được.

Tất cả những gì tôi tìm thấy trên web là các ví dụ siêu đơn giản, điều đó không giúp ích gì cho tôi nhiều. Hoặc chỉ các định nghĩa rất ngắn về các lớp và các phương thức lớp học, v.v.

Tôi có thể gửi cho bạn mã gốc nếu bạn muốn, nhưng nó khá dài.

+6

Đọc hướng dẫn Python [phần trên lớp] (http://docs.python.org/tutorial/classes.html). – BrenBarn

+1

Vui lòng tìm hiểu về các tùy chọn định dạng tại đây, đặc biệt là đối với mã. – Marcin

+2

Tôi không có nghĩa là để được bảo trợ, nhưng câu trả lời meta ở đây là bạn cần phải làm chậm một chút và tìm ra chính xác nơi mã của bạn đang lệch khỏi mong đợi của bạn. Hãy thử thực hiện các thay đổi nhỏ từ mã làm việc của bạn và kiểm tra từng thay đổi cho đến khi có sự cố nào đó xảy ra. Tái cấu trúc, họ gọi nó. Ngoài ra, không đánh bại chính mình, nó chỉ là mã - nó không bao giờ có ý nghĩa cho đến khi nó. – Ben

Trả lời

46
class Foo   (object): 
    # ^class name #^ inherits from object 

    bar = "Bar" #Class attribute. 

    def __init__(self): 
     #  #^ The first variable is the class instance in methods. 
     #  # This is called "self" by convention, but could be any name you want. 
     #^ double underscore (dunder) methods are usually special. This one 
     # gets called immediately after a new instance is created. 

     self.variable = "Foo" #instance attribute. 
     print self.variable, self.bar #<---self.bar references class attribute 
     self.bar = " Bar is now Baz" #<---self.bar is now an instance attribute 
     print self.variable, self.bar 

    def method(self, arg1, arg2): 
     #This method has arguments. You would call it like this: instance.method(1, 2) 
     print "in method (args):", arg1, arg2 
     print "in method (attributes):", self.variable, self.bar 


a = Foo() # this calls __init__ (indirectly), output: 
       # Foo bar 
       # Foo Bar is now Baz 
print a.variable # Foo 
a.variable = "bar" 
a.method(1, 2) # output: 
       # in method (args): 1 2 
       # in method (attributes): bar Bar is now Baz 
Foo.method(a, 1, 2) #<--- Same as a.method(1, 2). This makes it a little more explicit what the argument "self" actually is. 

class Bar(object): 
    def __init__(self, arg): 
     self.arg = arg 
     self.Foo = Foo() 

b = Bar(a) 
b.arg.variable = "something" 
print a.variable # something 
print b.Foo.variable # Foo 
+0

Hey mgilson, Thx cho câu trả lời và nỗ lực bạn đưa vào bài đăng của mình. Chính xác sự khác biệt giữa thanh phân bổ lớp và thuộc tính instance là self.bar là gì? ngoại trừ self.bar được gọi là imidiatly vì nó trong phương thức __init__?Tôi có nghĩa là những gì tôi có thể làm với self.bar mà tôi không thể làm với thanh? Ngoài ra tại sao bạn vượt qua đối số đó để a.method trực tiếp? bạn không thể vượt qua chúng để Foo() khi dụ lần thứ được tạo ra và sử dụng chúng thông qua Foo()? Và nếu có thì sao? Làm thế nào bạn sẽ đi về nếu dụ được tạo ra trong lớp khác, Foo() không được xác định? hoặc là nó luôn luôn được xác định. – Baf

+0

Nếu một cá thể không có thuộc tính instance cụ thể, thì nó sẽ rơi trở lại thuộc tính class và sử dụng nó. Vì vậy, đây là một cách cho mọi trường hợp của một lớp để chia sẻ một phần dữ liệu. Điều đó có ý nghĩa? (Tôi đã thêm một vài bình luận trong '__init__'). cái đó có giúp ích không? Đối với các câu hỏi khác của bạn, các đối số được truyền cho 'Foo()' được chuyển tiếp đến '__init__'. Nếu nó giúp, các phương thức instance giống như các hàm ngoại trừ đối số đầu tiên của chúng là cá thể được sử dụng để gọi phương thức đó. – mgilson

+0

Khi tôi cố gắng tạo một thể hiện của myclass trong lớp khác, tên không đổi màu, không phải mọi tên lớp đều được tô màu? cho phép nói rằng tôi có một biến thats được định nghĩa trong myclass thông qua self.variable trong __init__, làm thế nào tôi có thể đi về để sử dụng nó trong suốt các phương pháp lớp học? thế nào tôi có thể tạo một thể hiện của lớp khác trong lớp con của tôi đi qua các biến đến lớp khác, nơi chúng được gán cho self.othervariable và có thể được sử dụng trong lớp khác và các phương thức của nó không phải chuyển chúng vào một phương thức thể hiện trong lớp của tôi? – Baf

2

Toàn bộ vấn đề của một lớp là bạn tạo ra một dụ, và dụ rằng gói gọn một bộ dữ liệu. Vì vậy, sai khi nói rằng các biến của bạn là toàn cục trong phạm vi của lớp: giả sử rằng một cá thể giữ các thuộc tính, và cá thể đó có thể tham chiếu đến các thuộc tính riêng của nó trong bất kỳ mã nào của nó (thông qua self.whatever). Tương tự, bất kỳ mã nào khác được cho một cá thể có thể sử dụng cá thể đó để truy cập các thuộc tính của cá thể - tức là instance.whatever.

22

Vì vậy, đây là một ví dụ đơn giản về cách sử dụng các lớp học: Giả sử bạn là một viện tài chính. Bạn muốn tài khoản của khách hàng của bạn được quản lý bởi máy tính. Vì vậy, bạn cần phải mô hình hóa các tài khoản đó. Đó là nơi các lớp vào. Làm việc với các lớp được gọi là lập trình hướng đối tượng. Với các lớp bạn mô hình hóa các đối tượng thế giới thực trong máy tính của bạn. Vì vậy, chúng ta cần gì để mô hình hóa một tài khoản ngân hàng đơn giản? Chúng tôi cần một biến để tiết kiệm số dư và một biến tiết kiệm tên khách hàng. Ngoài ra, một số phương pháp để in- và giảm số dư. Điều đó có thể trông giống như:

class bankaccount(): 
    def __init__(self, name, money): 
     self.name = name 
     self.money = money 

    def earn_money(self, amount): 
     self.money += amount 

    def withdraw_money(self, amount): 
     self.money -= amount 

    def show_balance(self): 
     print self.money 

Bây giờ bạn có một mô hình trừu tượng của một tài khoản đơn giản và cơ chế của nó. def __init__(self, name, money) là hàm tạo của lớp. Nó xây dựng đối tượng trong bộ nhớ. Nếu bây giờ bạn muốn mở một tài khoản mới, bạn phải tạo một thể hiện của lớp của bạn. Để làm điều đó, bạn phải gọi hàm khởi tạo và truyền các tham số cần thiết. Trong Python một hàm tạo được gọi theo tên của các lớp:

spidermans_account = bankaccount("SpiderMan", 1000) 

Nếu người nhện muốn mua M.J. một chiếc nhẫn mới, anh ta phải rút một số tiền. Ông sẽ gọi phương thức withdraw trên tài khoản của mình:

spidermans_account.withdraw_money(100) 

Nếu anh muốn nhìn thấy sự cân bằng mà ông gọi là:

spidermans_account.show_balance() 

Toàn bộ điều về lớp học là để mô hình hóa các đối tượng, các thuộc tính và cơ chế của họ. Để tạo một đối tượng, hãy khởi tạo nó như trong ví dụ. Các giá trị được chuyển tới các lớp với các phương thức getter và setter như `earn_money() ´. Những phương thức này truy cập các biến đối tượng của bạn. Nếu bạn muốn lớp của bạn lưu trữ một đối tượng khác, bạn phải định nghĩa một biến cho đối tượng đó trong hàm tạo.

+0

Thx Man rất minh họa! một lần nữa tôi khôn ngoan tôi có thể chấp nhận điều này cũng như một câu trả lời, bởi vì nó đã cho tôi một số hiểu biết tốt, nhưng câu trả lời mgilson là dễ dàng hơn để vận chuyển đến mã acctual của tôi. Tôi muốn tất cả các tài liệu python đã được viết như các bạn doo nó ở đây, id dành ít thời gian trên stackoverflow: P! Xin vui lòng không lynch tôi bây giờ nhưng tôi thực sự nghĩ rằng tài liệu python là khá nghèo về khả năng comprehensability! Cảm ơn một lần nữa MAxPowers này đã giúp khá một chút! – Baf

+0

@Baf - giống như bất cứ điều gì khác, hãy cho nó một thời gian. Một khi bạn bắt đầu học thuật ngữ của sự vật, tài liệu python thực sự rất tốt. Nói cách khác, chỉ cần cung cấp cho mình một chút thời gian để bump lên trên đường cong học tập và bạn sẽ phát triển để yêu thích các tài liệu như phần còn lại của chúng tôi. – mgilson

+0

Và +1 cho một ví dụ thú vị. – mgilson