Hướng dẫn self in python stack overflow - self in python stack stack

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.

Hướng dẫn self in python stack overflow - self in python stack stack

Đã 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

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.

Hướng dẫn self in python stack overflow - self in python stack stack

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ự.

Hướng dẫn self in python stack overflow - self in python stack stack

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.

Hướng dẫn self in python stack overflow - self in python stack stack

Đố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:

Hướng dẫn self in python stack overflow - self in python stack stack

Đã 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

Hướng dẫn self in python stack overflow - self in python stack stack

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

Hướng dẫn self in python stack overflow - self in python stack stack

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)
1
ClassA.methodA(ObjectA, arg1, arg2)
2

Hướng dẫn self in python stack overflow - self in python stack stack

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

Hướng dẫn self in python stack overflow - self in python stack stack

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)
3

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ự

ClassA.methodA(ObjectA, arg1, arg2)
4

Phươ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)
5

Trong 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

Hướng dẫn self in python stack overflow - self in python stack stack

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)
6

Mã ở đâ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.

Hướng dẫn self in python stack overflow - self in python stack stack

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)
7

PS: Đ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

Hướng dẫn self in python stack overflow - self in python stack stack

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)
5

ClassA.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

Hướng dẫn self in python stack overflow - self in python stack stack

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)
9

Bâ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: []
1

Bạ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
3

Dướ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
4

Bây giờ hãy xem ví dụ dưới đây

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
5

Bâ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
6

Như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
7

Như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

Hướng dẫn self in python stack overflow - self in python stack stack

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.

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?

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'
1

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
8

Chương trình này sẽ xuất hiện:

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
9

Vì 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

Hướng dẫn self in python stack overflow - self in python stack stack

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

Hướng dẫn self in python stack overflow - self in python stack stack

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

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'
4 hoàn toàn tương đương với
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'
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.

trước đây là đoạn trích liên quan,

    def length(self):
        return math.sqrt(self.x ** 2 + self.y ** 2)
1

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'
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)
2

Tự 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)
3

Vì 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

Bản thân trong Python Stack Overflow là gì?

Bản thân 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. Tự 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ì đó.an object reference to the object itself, therefore, they are same. Python methods are not called in the context of the object itself. self in Python may be used to deal with custom object models or something.

Tự () trong Python là gì?

Bản thân được sử dụng để đại diện cho thể hiện của lớp.Với từ khóa này, bạn có thể truy cập các thuộc tính và phương thức của lớp trong Python.Nó liên kết các thuộc tính với các đối số đã cho.Lý do tại sao chúng ta sử dụng bản thân là Python không sử dụng cú pháp '@' để chỉ các thuộc tính thể hiện.used to represent the instance of the class. With this keyword, you can access the attributes and methods of the class in python. It binds the attributes with the given arguments. The reason why we use self is that Python does not use the '@' syntax to refer to instance attributes.

__ init __ là gì (bản thân trong Python?

Bản thân trong từ khóa trong Python được sử dụng cho tất cả các trường hợp trong một lớp.Bằng cách sử dụng từ khóa tự, người ta có thể dễ dàng truy cập tất cả các trường hợp được xác định trong một lớp, bao gồm các phương thức và thuộc tính của nó.trong đó.__init__ là một trong những phương pháp dành riêng trong Python.Trong lập trình định hướng đối tượng, nó được gọi là một hàm tạo.used to all the instances in a class. By using the self keyword, one can easily access all the instances defined within a class, including its methods and attributes. init. __init__ is one of the reserved methods in Python. In object oriented programming, it is known as a constructor.

Bạn có thể gán bản thân trong Python?

Người ta có thể sử dụng phép tự phân công trong một phương thức, để thay đổi lớp thể hiện thành một lớp dẫn xuất.Tất nhiên người ta có thể gán nó cho một đối tượng mới, nhưng sau đó việc sử dụng đối tượng mới gợn sóng thông qua phần còn lại của mã trong phương thức.Tái định vị nó thành bản thân, để lại phần còn lại của phương pháp không bị ảnh hưởng.. Of course one could assign it to a new object, but then the use of the new object ripples through the rest of code in the method. Reassiging it to self, leaves the rest of the method untouched.