Lý do bạn cần sử dụng
def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
4 là do Python không sử dụng cú pháp đặc biệt để chỉ các thuộc tính thể hiện. Python quyết định thực hiện các phương thức theo cách làm cho thể hiện phương thức được truyền tự động, nhưng không nhận được tự động: tham số đầu tiên của các phương thức là phiên bản phương thức được gọi. Điều đó làm cho các phương thức hoàn toàn giống như các hàm và để lại tên thực tế để sử dụng cho bạn [mặc dù def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5 là quy ước và mọi người thường sẽ cau mày khi bạn sử dụng thứ khác.] một đối tượng khác.Python có thể đã làm một cái gì đó khác để phân biệt các tên bình thường với các thuộc tính - cú pháp đặc biệt như Ruby có, hoặc yêu cầu các khai báo như C ++ và Java làm, hoặc có lẽ một cái gì đó khác biệt hơn - nhưng nó đã không. Python là tất cả để làm cho mọi thứ rõ ràng, làm cho nó rõ ràng là gì, và mặc dù nó không làm điều đó hoàn toàn ở khắp mọi nơi, nhưng nó làm điều đó ví dụ như các thuộc tính. Đó là lý do tại sao việc gán cho một thuộc tính thể hiện cần biết trường hợp nào để gán và đó là lý do tại sao nó cần
def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
4.
Đã trả lời ngày 25 tháng 4 năm 2010 lúc 20:25Apr 25, 2010 at 20:25
Thomas Woutersthomas WoutersThomas Wouters
127K23 Huy hiệu vàng146 Huy hiệu bạc122 Huy hiệu Đồng23 gold badges146 silver badges122 bronze badges
15
Giả sử bạn có lớp
def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
8 chứa phương thức def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
9 được định nghĩa là:def methodA[self, arg1, arg2]:
# do something
và
def length_global[vector]:
return math.sqrt[vector.x ** 2 + vector.y ** 2]
0 là một ví dụ của lớp này.Bây giờ khi
def length_global[vector]:
return math.sqrt[vector.x ** 2 + vector.y ** 2]
1 được gọi, Python nội bộ chuyển đổi nó cho bạn như:ClassA.methodA[ObjectA, arg1, arg2]
Biến
def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5 đề cập đến chính đối tượng.Đã trả lời ngày 26 tháng 1 năm 2014 lúc 17:31Jan 26, 2014 at 17:31
Arjun Sreedharanarjun SreedharanArjun Sreedharan
10,7K2 Huy hiệu vàng23 Huy hiệu bạc33 Huy hiệu đồng2 gold badges23 silver badges33 bronze badges
6
Hãy để một lớp vector đơn giản:
class Vector:
def __init__[self, x, y]:
self.x = x
self.y = y
Chúng tôi muốn có một phương pháp tính toán độ dài. Nó sẽ trông như thế nào nếu chúng ta muốn xác định nó trong lớp?
def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
Nó sẽ trông như thế nào khi chúng ta định nghĩa nó là một phương pháp/chức năng toàn cầu?
def length_global[vector]:
return math.sqrt[vector.x ** 2 + vector.y ** 2]
Vì vậy, toàn bộ cấu trúc vẫn giữ nguyên. Làm thế nào tôi có thể sử dụng điều này? Nếu chúng tôi cho rằng trong một khoảnh khắc chúng tôi đã viết một phương thức
def length_global[vector]:
return math.sqrt[vector.x ** 2 + vector.y ** 2]
3 cho lớp def length_global[vector]:
return math.sqrt[vector.x ** 2 + vector.y ** 2]
4 của chúng tôi, chúng tôi có thể làm điều này:Vector.length_new = length_global
v = Vector[3, 4]
print[v.length_new[]] # 5.0
Điều này hoạt động vì tham số đầu tiên của
def length_global[vector]:
return math.sqrt[vector.x ** 2 + vector.y ** 2]
5, có thể được sử dụng lại làm tham số def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5 trong def length_global[vector]:
return math.sqrt[vector.x ** 2 + vector.y ** 2]
7. Điều này sẽ không thể thực hiện được nếu không có def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5 rõ ràng.Một cách khác để hiểu sự cần thiết của
def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5 rõ ràng là xem Python thêm một số đường cú pháp. Khi bạn ghi nhớ, về cơ bản, một cuộc gọi nhưv_instance.length[]
được chuyển đổi nội bộ thành
Vector.length[v_instance]
Thật dễ dàng để thấy nơi
def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5 phù hợp. Bạn không thực sự viết các phương thức thể hiện trong Python; Những gì bạn viết là các phương thức lớp phải lấy một ví dụ như một tham số đầu tiên. Và do đó, bạn sẽ phải đặt tham số thể hiện ở đâu đó rõ ràng.
trống rỗng
4.8923 Huy hiệu vàng31 Huy hiệu bạc56 Huy hiệu Đồng3 gold badges31 silver badges56 bronze badges
Đã trả lời ngày 28 tháng 4 năm 2010 lúc 0:03Apr 28, 2010 at 0:03
DebilskidebilskiDebilski
65,9K11 Huy hiệu vàng109 Huy hiệu bạc133 Huy hiệu đồng11 gold badges109 silver badges133 bronze badges
11
Khi các đối tượng được khởi tạo, chính đối tượng được chuyển vào tham số tự.
Bởi vì điều này, dữ liệu của đối tượng bị ràng buộc với đối tượng. Dưới đây là một ví dụ về cách bạn có thể muốn hình dung những gì mà mỗi dữ liệu của đối tượng có thể trông. Lưu ý cách thay thế bản thân bằng tên đối tượng. Tôi không nói sơ đồ ví dụ này dưới đây là hoàn toàn chính xác nhưng hy vọng nó đã phục vụ một mục đích trong việc hình dung việc sử dụng bản thân.
Đối tượng được chuyển vào tham số tự để đối tượng có thể giữ dữ liệu của chính nó.
Mặc dù điều này có thể không hoàn toàn chính xác, hãy nghĩ về quá trình khởi tạo một đối tượng như thế này: khi một đối tượng được tạo ra, nó sử dụng lớp làm mẫu cho dữ liệu và phương thức của chính nó. Không chuyển tên riêng của nó vào tham số tự, các thuộc tính và phương thức trong lớp sẽ vẫn là một mẫu chung và sẽ không được tham khảo [thuộc] đối tượng. Vì vậy, bằng cách chuyển tên của đối tượng vào tham số tự nó, điều đó có nghĩa là nếu 100 đối tượng được khởi tạo từ một lớp, tất cả họ đều có thể theo dõi dữ liệu và phương thức của riêng mình.
Xem hình minh họa dưới đây:
Đã trả lời ngày 28 tháng 6 năm 2015 lúc 5:47Jun 28, 2015 at 5:47
sw123456sw123456sw123456
3.1911 Huy hiệu vàng18 Huy hiệu bạc35 Huy hiệu đồng1 gold badge18 silver badges35 bronze badges
9
Tôi thích ví dụ này:
class A:
foo = []
a, b = A[], A[]
a.foo.append[5]
b.foo
ans: [5]
class A:
def __init__[self]:
self.foo = []
a, b = A[], A[]
a.foo.append[5]
b.foo
ans: []
Đã trả lời ngày 26 tháng 4 năm 2010 lúc 16:02Apr 26, 2010 at 16:02
KameKamekame
Phù hiệu vàng 19.7k30 Huy hiệu bạc150 Huy hiệu đồng30 gold badges101 silver badges150 bronze badges
6
Tôi sẽ chứng minh với mã không sử dụng các lớp:does not use classes:
def state_init[state]:
state['field'] = 'init'
def state_add[state, x]:
state['field'] += x
def state_mult[state, x]:
state['field'] *= x
def state_getField[state]:
return state['field']
myself = {}
state_init[myself]
state_add[myself, 'added']
state_mult[myself, 2]
print[ state_getField[myself] ]
#--> 'initaddedinitadded'
Các lớp học chỉ là một cách để tránh truyền trong điều "trạng thái" này mọi lúc [và những thứ tốt đẹp khác như khởi tạo, thành phần lớp, các metaclass hiếm khi cần thiết và hỗ trợ các phương thức tùy chỉnh để ghi đè các toán tử].
Bây giờ chúng ta hãy trình bày mã trên bằng cách sử dụng máy móc lớp Python tích hợp, để cho thấy về cơ bản nó giống như thế nào.
ClassA.methodA[ObjectA, arg1, arg2]
0[Di chuyển câu trả lời của tôi từ câu hỏi đóng trùng trùng lặp]]
Đã trả lời ngày 22 tháng 6 năm 2011 lúc 0:27Jun 22, 2011 at 0:27
Ninjageckoninjageckoninjagecko
85,6K24 Huy hiệu vàng134 Huy hiệu bạc143 Huy hiệu đồng24 gold badges134 silver badges143 bronze badges
2
Các trích đoạn sau đây là từ tài liệu Python về bản thân:
Như trong Modula-3, không có chữ viết tắt nào [trong Python] để tham khảo các thành viên của đối tượng từ các phương thức của nó: hàm phương thức được khai báo với một đối số đầu tiên rõ ràng đại diện cho đối tượng, được cung cấp ngầm bởi cuộc gọi.
Thông thường, đối số đầu tiên của một phương thức được gọi là bản thân. Điều này không gì khác hơn là một quy ước: cái tên bản thân hoàn toàn không có ý nghĩa đặc biệt đối với Python. Tuy nhiên, lưu ý rằng bằng cách không tuân theo quy ước của bạn, mã của bạn có thể không thể đọc được đối với các lập trình viên Python khác và cũng có thể hình dung rằng một chương trình trình duyệt lớp có thể được viết dựa trên quy ước như vậy.
Để biết thêm thông tin, hãy xem hướng dẫn tài liệu Python về các lớp học.
Đã trả lời ngày 25 tháng 4 năm 2010 lúc 20:29Apr 25, 2010 at 20:29
Matthew RankinMatthew RankinMatthew Rankin
441K38 Huy hiệu vàng121 Huy hiệu bạc160 Huy hiệu đồng38 gold badges121 silver badges160 bronze badges
Cũng như tất cả các lý do khác đã được nêu, nó cho phép truy cập dễ dàng hơn vào các phương thức ghi đè; Bạn có thể gọi
Vector.length_new = length_global
v = Vector[3, 4]
print[v.length_new[]] # 5.0
1.Một ví dụ về nơi mà nó hữu ích:
ClassA.methodA[ObjectA, arg1, arg2]
1ClassA.methodA[ObjectA, arg1, arg2]
2
Ry- ♦♦
Phim thương hiệu vàng 212K5454 gold badges443 silver badges457 bronze badges
Đã trả lời ngày 25 tháng 4 năm 2010 lúc 20:31Apr 25, 2010 at 20:31
PonkadoodleponkadoodlePonkadoodle
5.6955 Huy hiệu vàng35 Huy hiệu bạc62 Huy hiệu Đồng5 gold badges35 silver badges62 bronze badges
Việc sử dụng nó tương tự như việc sử dụng từ khóa
Vector.length_new = length_global
v = Vector[3, 4]
print[v.length_new[]] # 5.0
2 trong Java, tức là để cung cấp một tham chiếu đến đối tượng hiện tại.
Đã trả lời ngày 30 tháng 8 năm 2012 lúc 16:37Aug 30, 2012 at 16:37
1
Python không phải là một ngôn ngữ được xây dựng cho lập trình hướng đối tượng không giống như Java hoặc C ++.
Khi gọi một phương thức tĩnh trong Python, người ta chỉ cần viết một phương thức với các đối số thông thường bên trong nó.
ClassA.methodA[ObjectA, arg1, arg2]
3Tuy nhiên, một phương thức đối tượng, yêu cầu bạn phải tạo một biến, trong trường hợp này, cần phải có đối số tự
ClassA.methodA[ObjectA, arg1, arg2]
4Phương pháp tự cũng được sử dụng để chỉ một trường biến trong lớp.
ClassA.methodA[ObjectA, arg1, arg2]
5Trong trường hợp này, bản thân đang đề cập đến biến động vật của toàn bộ lớp. Hãy nhớ rằng: nếu bạn có một biến trong một phương thức, bản thân sẽ không hoạt động. Biến đó chỉ đơn giản là chỉ tồn tại trong khi phương pháp đó đang chạy. Để xác định các trường [các biến của toàn bộ lớp], bạn phải xác định chúng bên ngoài các phương thức lớp.
Nếu bạn không hiểu một từ nào về những gì tôi đang nói, thì Google "lập trình hướng đối tượng". Một khi bạn hiểu điều này, bạn thậm chí sẽ không cần phải hỏi câu hỏi đó :].
Đã trả lời ngày 25 tháng 5 năm 2015 lúc 16:04May 25, 2015 at 16:04
rassa45rassa45rassa45
3,4161 Huy hiệu vàng28 Huy hiệu bạc43 Huy hiệu đồng1 gold badge28 silver badges43 bronze badges
8
Trước hết, bản thân là một cái tên thông thường, bạn có thể đặt bất cứ thứ gì khác [mạch lạc] thay cho nó.
Nó đề cập đến chính đối tượng, vì vậy khi bạn đang sử dụng nó, bạn đang tuyên bố rằng .name và .age là các thuộc tính của các đối tượng sinh viên [lưu ý, không phải của lớp học sinh] mà bạn sẽ tạo.
ClassA.methodA[ObjectA, arg1, arg2]
6Mã ở đây
Đã trả lời ngày 12 tháng 1 năm 2018 lúc 4:45Jan 12, 2018 at 4:45
0
def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5 là một tham chiếu đối tượng cho chính đối tượng, do đó, chúng giống nhau. Các phương thức Python không được gọi trong bối cảnh của chính đối tượng. def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5 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ì đó.Đã trả lời ngày 25 tháng 4 năm 2010 lúc 20:26Apr 25, 2010 at 20:26
Ming-TangMing-TangMing-Tang
17.2k8 Huy hiệu vàng36 Huy hiệu bạc75 Huy hiệu Đồng8 gold badges36 silver badges75 bronze badges
Nó ở đó để theo dõi Python Zen, rõ ràng là tốt hơn so với tiềm ẩn. Nó thực sự là một tham chiếu đến đối tượng lớp của bạn. Ví dụ, trong Java và PHP, nó được gọi là
Vector.length_new = length_global
v = Vector[3, 4]
print[v.length_new[]] # 5.0
2.Nếu
Vector.length_new = length_global
v = Vector[3, 4]
print[v.length_new[]] # 5.0
6 là một trường trên mô hình của bạn, bạn sẽ truy cập nó bằng Vector.length_new = length_global
v = Vector[3, 4]
print[v.length_new[]] # 5.0
7.
Ry- ♦♦
Phim thương hiệu vàng 212K5454 gold badges443 silver badges457 bronze badges
Đã trả lời ngày 25 tháng 4 năm 2010 lúc 20:31Aug 16, 2013 at 17:23
dan-klassondan-klassondan-klasson
Ponkadoodleponkadoodle14 gold badges59 silver badges100 bronze badges
5.6955 Huy hiệu vàng35 Huy hiệu bạc62 Huy hiệu Đồng
Việc sử dụng nó tương tự như việc sử dụng từ khóa
Vector.length_new = length_global
v = Vector[3, 4]
print[v.length_new[]] # 5.0
2 trong Java, tức là để cung cấp một tham chiếu đến đối tượng hiện tại.Jan 12, 2016 at 18:10
user441521user441521user441521
Đã trả lời ngày 30 tháng 8 năm 2012 lúc 16:3722 gold badges85 silver badges156 bronze badges
Python không phải là một ngôn ngữ được xây dựng cho lập trình hướng đối tượng không giống như Java hoặc C ++.
Khi gọi một phương thức tĩnh trong Python, người ta chỉ cần viết một phương thức với các đối số thông thường bên trong nó.
Tuy nhiên, một phương thức đối tượng, yêu cầu bạn phải tạo một biến, trong trường hợp này, cần phải có đối số tự
Đối số đầu tiên của mọi phương thức lớp, bao gồm cả init, luôn luôn là một tham chiếu đến thể hiện hiện tại của lớp. Theo quy ước, lập luận này luôn được đặt tên là bản thân. Trong phương thức init, tự đề cập đến đối tượng mới được tạo; Trong các phương thức lớp khác, nó đề cập đến trường hợp có phương thức được gọi. Ví dụ, mã dưới đây giống như mã trên.
2: Tại sao chúng ta có nó theo cách này và tại sao chúng ta không thể loại bỏ nó như một đối số, như Java và có một từ khóa thay thế
Một điều khác tôi muốn thêm là, một đối số
def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5 tùy chọn cho phép tôi khai báo các phương thức tĩnh bên trong một lớp, bằng cách không viết def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5.Ví dụ về mã:
ClassA.methodA[ObjectA, arg1, arg2]
7PS: Điều này chỉ hoạt động trong Python 3.x.:This works only in Python 3.x.
Trong các phiên bản trước, bạn phải thêm một cách rõ ràng
v_instance.length[]
1 Trình trang trí, nếu không thì đối số def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5 là bắt buộc.Đã trả lời ngày 1 tháng 8 năm 2018 lúc 10:53Aug 1, 2018 at 10:53
Bugs BuggyBugs BuggyBugs Buggy
1.50416 huy hiệu bạc38 Huy hiệu đồng16 silver badges38 bronze badges
Hãy xem ví dụ sau, giải thích rõ ràng mục đích của
def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5ClassA.methodA[ObjectA, arg1, arg2]
8 def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5 được sử dụng/cần thiết để phân biệt giữa các trường hợp.Nguồn: Tự biến trong Python giải thích - Pythontips
Đã trả lời ngày 15 tháng 11 năm 2014 lúc 7:54Nov 15, 2014 at 7:54
kmario23kmario23kmario23
53K13 Huy hiệu vàng148 Huy hiệu bạc146 Huy hiệu đồng13 gold badges148 silver badges146 bronze badges
2
Là bởi vì nhân tiện, Python được thiết kế, các lựa chọn thay thế sẽ khó hoạt động. Python được thiết kế để cho phép các phương thức hoặc chức năng được xác định trong bối cảnh mà cả hai
Vector.length_new = length_global
v = Vector[3, 4]
print[v.length_new[]] # 5.0
2 [A-LA Java/C ++]] hoặc rõ ràng v_instance.length[]
6 [A-LA Ruby] sẽ không hoạt động. Chúng ta hãy có một ví dụ với cách tiếp cận rõ ràng với các quy ước Python:ClassA.methodA[ObjectA, arg1, arg2]
9Bây giờ hàm
v_instance.length[]
7 sẽ không hoạt động vì nó cho rằng def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5 là một biến toàn cầu [và trong v_instance.length[]
9 cũng vậy]. Giải pháp thay thế sẽ là thực thi phương thức với phạm vi toàn cầu được thay thế [trong đó def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5 là đối tượng].Cách tiếp cận ngầm sẽ là
class Vector:
def __init__[self, x, y]:
self.x = x
self.y = y
0Điều này có nghĩa là
Vector.length[v_instance]
1 sẽ được hiểu là một biến cục bộ trong v_instance.length[]
7 [và trong v_instance.length[]
9 cũng vậy]. Giải pháp thay thế ở đây sẽ là thực thi các phương thức với phạm vi cục bộ được thay thế được giữ lại giữa các cuộc gọi, nhưng điều đó sẽ loại bỏ khả năng tích cực của các biến cục bộ phương thức.Tuy nhiên, tình hình hiện tại hoạt động tốt:
class Vector:
def __init__[self, x, y]:
self.x = x
self.y = y
1Ở đây khi được gọi là phương thức
v_instance.length[]
9 sẽ nhận được đối tượng được gọi qua tham số def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5 và v_instance.length[]
7 vẫn có thể được gọi với một đối tượng là tham số và hoạt động giống nhau [nó giống như Vector.length[v_instance]
7 tôi nghĩ].Đã trả lời ngày 27 tháng 8 năm 2015 lúc 7:31Aug 27, 2015 at 7:31
Skykingskykingskyking
Huy hiệu vàng 13.4K11 gold badge34 silver badges55 bronze badges
Trong phương thức
Vector.length[v_instance]
8, tự đề cập đến đối tượng mới được tạo; Trong các phương thức lớp khác, nó đề cập đến trường hợp có phương thức được gọi.Bản thân, như một cái tên, chỉ là một quy ước, hãy gọi nó như bạn muốn! Nhưng khi sử dụng nó, ví dụ để xóa đối tượng, bạn phải sử dụng cùng tên:
Vector.length[v_instance]
9, trong đó class A:
foo = []
a, b = A[], A[]
a.foo.append[5]
b.foo
ans: [5]
class A:
def __init__[self]:
self.foo = []
a, b = A[], A[]
a.foo.append[5]
b.foo
ans: []
0 đã được sử dụng trong class A:
foo = []
a, b = A[], A[]
a.foo.append[5]
b.foo
ans: [5]
class A:
def __init__[self]:
self.foo = []
a, b = A[], A[]
a.foo.append[5]
b.foo
ans: []
1just a convention, call it as you want ! but when using it, for example to delete the object, you have to use the
same name: Vector.length[v_instance]
9, where class A:
foo = []
a, b = A[], A[]
a.foo.append[5]
b.foo
ans: [5]
class A:
def __init__[self]:
self.foo = []
a, b = A[], A[]
a.foo.append[5]
b.foo
ans: []
0 was used in the class A:
foo = []
a, b = A[], A[]
a.foo.append[5]
b.foo
ans: [5]
class A:
def __init__[self]:
self.foo = []
a, b = A[], A[]
a.foo.append[5]
b.foo
ans: []
1Bạn cũng nên xem
class A:
foo = []
a, b = A[], A[]
a.foo.append[5]
b.foo
ans: [5]
class A:
def __init__[self]:
self.foo = []
a, b = A[], A[]
a.foo.append[5]
b.foo
ans: []
2, để có bức tranh lớn hơn. Bài này có thể hữu ích.the bigger picture. This post could be helpful.
Đã trả lời ngày 26 tháng 1 năm 2014 lúc 18:11Jan 26, 2014 at 18:11
Oussama L.Oussama L.Oussama L.
1.8026 Huy hiệu vàng25 Huy hiệu bạc 30 Huy hiệu Đồng6 gold badges25 silver badges30 bronze badges
Tự hành động giống như tên đối tượng hiện tại hoặc thể hiện của lớp.
class Vector:
def __init__[self, x, y]:
self.x = x
self.y = y
2Đã trả lời ngày 28 tháng 10 năm 2019 lúc 2:15Oct 28, 2019 at 2:15
Từ khóa "Tự" giữ tài liệu tham khảo của lớp và tùy thuộc vào bạn nếu bạn muốn sử dụng nó hay không nhưng nếu bạn chú ý, bất cứ khi nào bạn tạo một phương thức mới trong Python, Python sẽ tự động viết từ khóa tự cho bạn. Nếu bạn thực hiện một số R & D, bạn sẽ nhận thấy rằng nếu bạn tạo ra hai phương thức trong một lớp và cố gắng gọi một trong những phương thức khác, nó sẽ không nhận ra phương thức trừ khi bạn tự thêm [tham chiếu của lớp].
class Vector:
def __init__[self, x, y]:
self.x = x
self.y = y
3Dưới đây mã ném lỗi tham chiếu không thể giải quyết được.
class Vector:
def __init__[self, x, y]:
self.x = x
self.y = y
4Bây giờ hãy xem ví dụ dưới đây
class Vector:
def __init__[self, x, y]:
self.x = x
self.y = y
5Bây giờ khi bạn tạo đối tượng của lớp testa, bạn có thể gọi phương thức m1 [] bằng cách sử dụng đối tượng lớp như thế này làm phương thức m1 [] đã bao gồm từ khóa tự
class Vector:
def __init__[self, x, y]:
self.x = x
self.y = y
6Nhưng nếu bạn muốn gọi Phương thức M2 [], vì là không có tự tham khảo để bạn có thể gọi M2 [] trực tiếp bằng tên lớp như bên dưới
class Vector:
def __init__[self, x, y]:
self.x = x
self.y = y
7Nhưng hãy giữ trong thực tế để sống với từ khóa bản thân vì cũng có những lợi ích khác như tạo ra biến toàn cầu bên trong và vân vân.
Đã trả lời ngày 8 tháng 8 năm 2020 lúc 21:49Aug 8, 2020 at 21:49
Rahul Jharahul JhaRahul Jha
7261 Huy hiệu vàng9 Huy hiệu bạc22 Huy hiệu đồng1 gold badge9 silver badges22 bronze badges
def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5 là không thể tránh khỏi.
def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
Chỉ có một câu hỏi nên
def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5 được ngầm định hoặc rõ ràng. class A:
foo = []
a, b = A[], A[]
a.foo.append[5]
b.foo
ans: [5]
class A:
def __init__[self]:
self.foo = []
a, b = A[], A[]
a.foo.append[5]
b.foo
ans: []
5 đã giải quyết câu hỏi này nói rằng def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5 phải ở lại.Vậy def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5 sống ở đâu?
def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
Nếu chúng ta chỉ tuân thủ lập trình chức năng, chúng ta sẽ không cần
def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5. Khi chúng ta vào Python OOP, chúng ta tìm thấy def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5 ở đó.Đây là trường hợp sử dụng điển hình
def state_init[state]:
state['field'] = 'init'
def state_add[state, x]:
state['field'] += x
def state_mult[state, x]:
state['field'] *= x
def state_getField[state]:
return state['field']
myself = {}
state_init[myself]
state_add[myself, 'added']
state_mult[myself, 2]
print[ state_getField[myself] ]
#--> 'initaddedinitadded'
0 với phương pháp def state_init[state]:
state['field'] = 'init'
def state_add[state, x]:
state['field'] += x
def state_mult[state, x]:
state['field'] *= x
def state_getField[state]:
return state['field']
myself = {}
state_init[myself]
state_add[myself, 'added']
state_mult[myself, 2]
print[ state_getField[myself] ]
#--> 'initaddedinitadded'
1class Vector:
def __init__[self, x, y]:
self.x = x
self.y = y
8Chương trình này sẽ xuất hiện:
class Vector:
def __init__[self, x, y]:
self.x = x
self.y = y
9Vì vậy,
def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5 giữ địa chỉ bộ nhớ của thể hiện lớp. Mục đích của def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
5 sẽ là giữ các phương thức tham khảo và để chúng tôi có quyền truy cập rõ ràng vào tài liệu tham khảo đó.explicit access to that
reference. Lưu ý Có ba loại phương pháp lớp khác nhau:
- Phương pháp tĩnh [đọc: chức năng],
- Phương pháp lớp học,
- Phương pháp ví dụ [đã đề cập].
Đã trả lời ngày 23 tháng 5 năm 2019 lúc 16:32May 23, 2019 at 16:32
tuyến tiền liệtprosti
37.9K11 Huy hiệu vàng169 Huy hiệu bạc144 Huy hiệu đồng11 gold badges169 silver badges144 bronze badges
Từ 'tự' đề cập đến ví dụ của một lớp học
def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
0Đã trả lời ngày 9 tháng 4 năm 2021 lúc 4:52Apr 9, 2021 at 4:52
BohhavdevoprabhavdevoPrabhavDevo
1.3706 huy hiệu bạc21 Huy hiệu đồng6 silver badges21 bronze badges
Đó là một tham chiếu rõ ràng đến đối tượng thể hiện lớp.
Đã trả lời ngày 25 tháng 4 năm 2010 lúc 20:24Apr 25, 2010 at 20:24
SilentghostsilentghostSilentGhost
295K64 Huy hiệu vàng301 Huy hiệu bạc291 Huy hiệu Đồng64 gold badges301 silver badges291 bronze badges
2
từ các tài liệu,
Điều đặc biệt về các phương thức là đối tượng thể hiện được truyền như là đối số đầu tiên của hàm. Trong ví dụ của chúng tôi, cuộc gọi
4 hoàn toàn tương đương vớidef state_init[state]: state['field'] = 'init' def state_add[state, x]: state['field'] += x def state_mult[state, x]: state['field'] *= x def state_getField[state]: return state['field'] myself = {} state_init[myself] state_add[myself, 'added'] state_mult[myself, 2] print[ state_getField[myself] ] #--> 'initaddedinitadded'
5. Nói chung, gọi một phương thức có danh sách N đối số tương đương với việc gọi hàm tương ứng với danh sách đối số được tạo bằng cách chèn đối tượng phiên bản Phương thức trước đối số đầu tiên.def state_init[state]: state['field'] = 'init' def state_add[state, x]: state['field'] += x def state_mult[state, x]: state['field'] *= x def state_getField[state]: return state['field'] myself = {} state_init[myself] state_add[myself, 'added'] state_mult[myself, 2] print[ state_getField[myself] ] #--> 'initaddedinitadded'
trước đây là đoạn trích liên quan,
def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
1def state_init[state]:
state['field'] = 'init'
def state_add[state, x]:
state['field'] += x
def state_mult[state, x]:
state['field'] *= x
def state_getField[state]:
return state['field']
myself = {}
state_init[myself]
state_add[myself, 'added']
state_mult[myself, 2]
print[ state_getField[myself] ]
#--> 'initaddedinitadded'
6Đã trả lời ngày 26 tháng 2 năm 2020 lúc 10:39Feb 26, 2020 at 10:39
Laxmanlaxmanlaxman
1.4024 huy hiệu vàng11 Huy hiệu bạc31 Huy hiệu đồng4 gold badges11 silver badges31 bronze badges
Tôi sẽ nói cho Python ít nhất, tham số bản thân có thể được coi là một người giữ chỗ. Hãy xem này:
def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
2Tự trong trường hợp này và rất nhiều người khác đã được sử dụng như một phương pháp để nói lưu trữ giá trị tên. Tuy nhiên, sau đó, chúng tôi sử dụng P1 để gán nó cho lớp chúng tôi đang sử dụng. Sau đó, khi chúng tôi in nó, chúng tôi sử dụng cùng một từ khóa P1.
Hy vọng điều này sẽ giúp cho Python!
Đã trả lời ngày 23 tháng 6 năm 2020 lúc 13:50Jun 23, 2020 at 13:50
RishirishiRishi
Phù hiệu đồng 4144 bronze badges
2 xu nhỏ của tôi
Trong người lớp này, chúng tôi đã xác định phương pháp init với bản thân và điều thú vị cần chú ý ở đây là vị trí bộ nhớ của cả biến bản thân và biến thể P là giống nhau
def state_init[state]:
state['field'] = 'init'
def state_add[state, x]:
state['field'] += x
def state_mult[state, x]:
state['field'] *= x
def state_getField[state]:
return state['field']
myself = {}
state_init[myself]
state_add[myself, 'added']
state_mult[myself, 2]
print[ state_getField[myself] ]
#--> 'initaddedinitadded'
7init method with the self and interesting thing to notice here is the memory location of both the self and instance variable p is same def state_init[state]:
state['field'] = 'init'
def state_add[state, x]:
state['field'] += x
def state_mult[state, x]:
state['field'] *= x
def state_getField[state]:
return state['field']
myself = {}
state_init[myself]
state_add[myself, 'added']
state_mult[myself, 2]
print[ state_getField[myself] ]
#--> 'initaddedinitadded'
7 def length[self]:
return math.sqrt[self.x ** 2 + self.y ** 2]
3Vì vậy, như được giải thích ở trên, cả biến bản thân và thể hiện là cùng một đối tượng.
Đã trả lời ngày 27 tháng 12 năm 2020 lúc 0:13Dec 27, 2020 at 0:13
Saransaransaran
3241 Huy hiệu vàng3 Huy hiệu bạc13 Huy hiệu đồng1 gold badge3 silver badges13 bronze badges