Def __init__(self python la gì)

  • Blog
  • Tin tức

20/05/2021 02:02

Self trong Python là một tham chiếu đến thể hiện hiện tại của lớp, và được sử dụng để biến truy cập thuộc về lớp. Tìm hiểu về Self trong Python qua bài viết dưới đây

[Self trong Python] Nếu bạn đang làm việc với Python, self là một trong những yếu tố bạn cần nắm rõ trong lòng bàn tay. Được sử dụng trong các định nghĩa phương thức và trong việc khởi tạo các biến. Phương thức self trong Python được sử dụng một cách rõ ràng khi ta cần định nghĩa một phương thức. Trong bài viết này chúng ta sẽ tìm hiểu sâu hơn về self trong Python với các ví dụ cụ thể.

Tại sao lại cần sử dụng Self trong Python là gì?

Các tham số self là một tham chiếu đến thể hiện hiện tại của lớp, và được sử dụng để biến truy cập thuộc về lớp.bạn không nhất thiết đặt tên nó là self, bạn có thể gọi nó bất cứ thứ gì bạn thích, nhưng nó phải là tham số đầu tiên của bất kỳ hàm nào trong 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 self là Python không sử dụng cú pháp '@' để tham chiếu đến các thuộc tính cá thể. Trong Python, chúng ta có các phương thức làm cho phiên bản được truyền tự động, nhưng không được nhận tự động.

Ví dụ:

class food[]:
 
# init method or constructor
def __init__[self, fruit, color]:
self.fruit = fruit
self.color = color
 
def show[self]:
print["fruit is", self.fruit]
print["color is", self.color ]
 
apple = food["apple", "red"]
grapes = food["grapes", "green"]
 
apple.show[]
grapes.show[]

Output:

Fruit is apple

color is red

Fruit is grapes

color is green

>>> Tham khảo: Khóa học lập trình Python

Tự xây dựng lớp Python

Self cũng được sử dụng để tham chiếu đến một trường biến trong lớp. Cùng xem ví dụ dưới đây và cách mà nó hoạt động:

class Person:
 
# name made in constructor
def __init__[self, John]:
self.name = John
 
def get_person_name[self]:
return self.name

Trong ví dụ trên, self tham chiếu đến biến tên của toàn bộ lớp Person. Ở đây, nếu chúng ta có một biến trong một phương thức, thì self sẽ không hoạt động. Biến đó đơn giản chỉ tồn tại trong khi phương thức đang chạy và do đó, là biến cục bộ của phương thức đó. Để xác định các trường toàn cục hoặc các biến của lớp hoàn chỉnh, chúng ta cần định nghĩa chúng bên ngoài các phương thức của lớp.

>>> Đọc thêm: Giải đáp: Ngôn ngữ lập trình Python dùng để làm gì?

Self trong Python có phải là một từ khóa?

self là một tham số trong hàm và người dùng có thể sử dụng một tên tham số khác thay cho nó. Mặc dù bạn nên sử dụng self vì nó làm tăng khả năng đọc mã. self không phải là một từ khóa.

Ví dụ:

class this_is_class:
def show[in_place_of_self]:
print["It is not a keyword "
"and you can use a different keyword"]
 
object = this_is_class[]
object.show[]

Output:

It is not a keyword and you can use a different keyword

Kết luận:

Self trong Python là đại diện cho thể hiện của lớp. Bằng cách sử dụng từ khóa “self”, chúng ta 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. Bài viết trên đã giới thiệu tới bạn về self trong Python và một số ví dụ cụ thể để bạn hiểu rõ hơn về phương thức này. Tìm hiểu thêm về Python cùng các ngôn ngữ lập trình khác qua các khóa học lập trình tại tại Viện công nghệ thông tin T3H để nắm rõ hơn các kiến thức về lập trình bạn nhé!

Nguồn tham khảo: geeksforgeeks, edureka

answer

510

Trong mã này:

class A[object]:
    def __init__[self]:
        self.x = 'Hello'

    def method_a[self, foo]:
        print self.x + ' ' + foo

... selfbiến đại diện cho thể hiện của chính đối tượng. Hầu hết các ngôn ngữ hướng đối tượng chuyển điều này như một tham số ẩn cho các phương thức được xác định trên một đối tượng; Python thì không. Bạn phải khai báo rõ ràng. Khi bạn tạo một thể hiện của Alớp và gọi các phương thức của nó, nó sẽ được truyền tự động, như trong ...

a = A[]               # We do not pass any argument to the __init__ method
a.method_a['Sailor!'] # We only pass a single argument

Các __init__phương pháp là khoảng những gì đại diện cho một nhà xây dựng bằng Python. Khi bạn gọi A[]Python tạo một đối tượng cho bạn và truyền nó làm tham số đầu tiên cho __init__phương thức. Bất kỳ tham số bổ sung nào [ví dụ A[24, 'Hello']:] cũng sẽ được chuyển qua làm đối số - trong trường hợp này gây ra ngoại lệ được nêu ra, vì hàm tạo không mong đợi chúng.

510 hữu ích 2 bình luận chia sẻ

answer

212

Đúng, bạn đã đúng, đây là những cấu trúc oop.

__init__là người xây dựng cho một lớp. Các selfthông số liên quan đến trường hợp của đối tượng [như thistrong C ++].

class Point:
    def __init__[self, x, y]:
        self._x = x
        self._y = y

Các __init__phương pháp được gọi khi bộ nhớ cho các đối tượng được phân bổ:

x = Point[1,2]

Điều quan trọng là sử dụng selftham số bên trong phương thức của đối tượng nếu bạn muốn duy trì giá trị với đối tượng. Ví dụ, nếu bạn triển khai __init__phương thức như thế này:

class Point:
    def __init__[self, x, y]:
        _x = x
        _y = y

Các tham số xcủa bạn ysẽ được lưu trữ trong các biến trên ngăn xếp và sẽ bị loại bỏ khi phương thức init vượt quá phạm vi. Đặt các biến đó thành self._xself._yđặt các biến đó là thành viên của Pointđối tượng [có thể truy cập trong suốt vòng đời của đối tượng].

212 hữu ích 1 bình luận chia sẻ

answer

163

Một ví dụ minh họa ngắn gọn

Với hy vọng nó có thể giúp một chút, đây là một ví dụ đơn giản mà tôi đã sử dụng để hiểu sự khác biệt giữa một biến được khai báo bên trong một lớp và một biến được khai báo bên trong một __init__hàm:

class MyClass[object]:
     i = 123
     def __init__[self]:
         self.i = 345

a = MyClass[]
print a.i
345
print MyClass.i
123

163 hữu ích 2 bình luận chia sẻ

answer

38

Nói ngắn gọn:

  1. selfnhư nó gợi ý, đề cập đến chính nó - đối tượng đã gọi phương thức này. Nghĩa là, nếu bạn có N đối tượng gọi phương thức, thì self.asẽ tham chiếu đến một thể hiện riêng của biến cho mỗi đối tượng N. Tưởng tượng N bản sao của biến acho từng đối tượng
  2. __init__là những gì được gọi là hàm tạo trong các ngôn ngữ OOP khác như C ++ / Java. Ý tưởng cơ bản là nó là một phương thức đặc biệt được gọi tự động khi một đối tượng của Class đó được tạo

38 hữu ích 0 bình luận chia sẻ

answer

25

__init__không hoạt động như một nhà xây dựng. Bạn sẽ cần truyền "bản thân" cho bất kỳ hàm lớp nào làm đối số đầu tiên nếu bạn muốn chúng hoạt động như các phương thức không tĩnh. "Tự" là các biến đối tượng cho lớp của bạn.

25 hữu ích 1 bình luận chia sẻ

answer

23

Hãy thử mã này. Hy vọng nó sẽ giúp nhiều lập trình viên C như tôi học Py.

#! /usr/bin/python2

class Person:

    '''Doc - Inside Class '''

    def __init__[self, name]:
        '''Doc - __init__ Constructor'''
        self.n_name = name        

    def show[self, n1, n2]:
        '''Doc - Inside Show'''
        print self.n_name
        print 'Sum = ', [n1 + n2]

    def __del__[self]:
        print 'Destructor Deleting object - ', self.n_name

p=Person['Jay']
p.show[2, 3]
print p.__doc__
print p.__init__.__doc__
print p.show.__doc__

Đầu ra:

Jay

Sum = 5

Doc - Inside Class

Doc - __init__ Constructor

Doc - Inside Show

Destructor Deleting object - Jay

23 hữu ích 2 bình luận chia sẻ

answer

20

Có vấn đề với bản thân mình. Ngay cả sau khi đọc câu trả lời ở đây.

Để hiểu đúng __init__phương pháp bạn cần hiểu bản thân.

Thông số tự

Các đối số được __init__phương thức chấp nhận là:

def __init__[self, arg1, arg2]:

Nhưng chúng tôi chỉ thực sự vượt qua nó hai đối số:

instance = OurClass['arg1', 'arg2']

Trường hợp có thêm đối số đến từ đâu?

Khi chúng ta truy cập các thuộc tính của một đối tượng, chúng ta thực hiện nó theo tên [hoặc bằng cách tham chiếu]. Ở đây ví dụ là một tham chiếu đến đối tượng mới của chúng tôi. Chúng tôi truy cập phương thức printargs của đối tượng thể hiện bằng instance.printargs.

Để truy cập các thuộc tính đối tượng từ bên trong __init__phương thức, chúng ta cần một tham chiếu đến đối tượng.

Bất cứ khi nào một phương thức được gọi, một tham chiếu đến đối tượng chính được truyền làm đối số đầu tiên. Theo quy ước, bạn luôn gọi đối số đầu tiên này cho phương thức của mình.

Điều này có nghĩa là trong __init__phương pháp chúng ta có thể làm:

self.arg1 = arg1
self.arg2 = arg2

Ở đây chúng ta đang thiết lập các thuộc tính trên đối tượng. Bạn có thể xác minh điều này bằng cách làm như sau:

instance = OurClass['arg1', 'arg2']
print instance.arg1
arg1

các giá trị như thế này được gọi là thuộc tính đối tượng. Ở đây __init__phương thức đặt các thuộc tính arg1 và arg2 của thể hiện.

nguồn: //www.voidspace.org.uk/python/articles/OOP.shtml#the-init-method

20 hữu ích 0 bình luận chia sẻ

answer

16

lưu ý rằng selfthực sự có thể là bất kỳ định danh python hợp lệ. Ví dụ, chúng ta có thể dễ dàng viết, từ ví dụ của Chris B:

class A[object]:
    def __init__[foo]:
        foo.x = 'Hello'

    def method_a[bar, foo]:
        print bar.x + ' ' + foo

và nó sẽ hoạt động chính xác như nhau. Tuy nhiên, nên sử dụng bản thân vì những người dùng python khác sẽ nhận ra nó dễ dàng hơn.

16 hữu ích 1 bình luận chia sẻ

answer

14

Về cơ bản, bạn cần sử dụng từ khóa 'tự' khi sử dụng một biến trong nhiều hàm trong cùng một lớp. Đối với init , nó được sử dụng để thiết lập các giá trị mặc định, không có chức năng nào khác trong lớp đó được gọi.

14 hữu ích 2 bình luận chia sẻ

answer

14

  1. __init__về cơ bản là một hàm sẽ "khởi tạo" / "kích hoạt" các thuộc tính của lớp cho một đối tượng cụ thể, một khi được tạo và khớp với lớp tương ứng ..
  2. self đại diện cho đối tượng đó sẽ kế thừa các tính chất đó.

14 hữu ích 1 bình luận chia sẻ

answer

13

Các đối tượng lớp hỗ trợ hai loại hoạt động: tham chiếu thuộc tính và khởi tạo

Tham chiếu thuộc tính sử dụng cú pháp tiêu chuẩn được sử dụng cho tất cả các tham chiếu thuộc tính trong Python: obj.name. Tên thuộc tính hợp lệ là tất cả các tên trong không gian tên của lớp khi đối tượng lớp được tạo. Vì vậy, nếu định nghĩa lớp trông như thế này:

class MyClass:
    """A simple example class"""
    i = 12345

    def f[self]:
        return 'hello world'

sau đó MyClass.iMyClass.flà các tham chiếu thuộc tính hợp lệ, trả về một số nguyên và một đối tượng hàm, tương ứng. Các thuộc tính lớp cũng có thể được gán cho, vì vậy bạn có thể thay đổi giá trị của MyClass.iphép gán. __doc__cũng là một thuộc tính hợp lệ, trả về chuỗi doc thuộc về lớp: "Một lớp ví dụ đơn giản".

Lớp khởi tạo sử dụng ký hiệu hàm. Chỉ cần giả vờ rằng đối tượng lớp là một hàm không tham số trả về một thể hiện mới của lớp. Ví dụ:

x = MyClass[]

Các instantiation hoạt động [ “kêu gọi” một đối tượng lớp] tạo ra một đối tượng rỗng. Nhiều lớp muốn tạo các đối tượng với các thể hiện được tùy chỉnh theo trạng thái ban đầu cụ thể. Do đó, một lớp có thể định nghĩa một phương thức đặc biệt có tên __init__[], như thế này:

def __init__[self]:
    self.data = []

Khi một lớp định nghĩa một __init__[]phương thức, việc khởi tạo lớp sẽ tự động gọi ra __init__[]đối tượng lớp mới được tạo. Vì vậy, trong ví dụ này, một thể hiện mới, khởi tạo có thể thu được bằng cách:

x = MyClass[]

Tất nhiên, __init__[]phương pháp có thể có các đối số để linh hoạt hơn. Trong trường hợp đó, các đối số được cung cấp cho toán tử khởi tạo lớp được truyền vào __init__[]. Ví dụ,

class Complex:
    def __init__[self, realpart, imagpart]:
        self.r = realpart
        self.i = imagpart

x = Complex[3.0, -4.5]
x.r, x.i

Lấy từ tài liệu chính thức giúp tôi nhiều nhất cuối cùng.

Đây là ví dụ của tôi

class Bill[]:
    def __init__[self,apples,figs,dates]:
        self.apples = apples
        self.figs = figs
        self.dates = dates
        self.bill = apples + figs + dates
        print ["Buy",self.apples,"apples", self.figs,"figs 
                and",self.dates,"dates. 
                Total fruitty bill is",self.bill," pieces of fruit :]"]

Khi bạn tạo cá thể của lớp Bill:

purchase = Bill[5,6,7]

Bạn lấy:

> Buy 5 apples 6 figs and 7 dates. Total fruitty bill is 18  pieces of
> fruit :]

13 hữu ích 0 bình luận chia sẻ

answer

12

'Cái tôi' là một tham chiếu đến thể hiện của lớp

class foo:
    def bar[self]:
            print "hi"

Bây giờ chúng ta có thể tạo một thể hiện của foo và gọi phương thức trên nó, tham số tự được thêm bởi Python trong trường hợp này:

f = foo[]
f.bar[]

Nhưng nó cũng có thể được truyền vào nếu lệnh gọi phương thức không nằm trong ngữ cảnh của một thể hiện của lớp, mã bên dưới thực hiện điều tương tự

f = foo[]
foo.bar[f]

Điều thú vị là tên biến 'tự' chỉ là một quy ước. Định nghĩa dưới đây sẽ hoạt động giống hệt nhau .. Đã nói rằng đó là quy ước rất mạnh nên luôn luôn phải tuân theo , nhưng nó nói lên điều gì đó về bản chất linh hoạt của ngôn ngữ

class foo:
    def bar[s]:
            print "hi"

12 hữu ích 3 bình luận chia sẻ

answer

8

# Source: Class and Instance Variables
# //docs.python.org/2/tutorial/classes.html#class-and-instance-variables

class MyClass[object]:
    # class variable
    my_CLS_var = 10

    # sets "init'ial" state to objects/instances, use self argument
    def __init__[self]:
        # self usage => instance variable [per object]
        self.my_OBJ_var = 15

        # also possible, class name is used => init class variable
        MyClass.my_CLS_var = 20


def run_example_func[]:
    # PRINTS    10    [class variable]
    print MyClass.my_CLS_var

    # executes __init__ for obj1 instance
    # NOTE: __init__ changes class variable above
    obj1 = MyClass[]

    # PRINTS    15    [instance variable]
    print obj1.my_OBJ_var

    # PRINTS    20    [class variable, changed value]
    print MyClass.my_CLS_var


run_example_func[]

8 hữu ích 0 bình luận chia sẻ

answer

7

Trong mã này:

class Cat:
    def __init__[self, name]:
        self.name = name
    def info[self]:
        print 'I am a cat and I am called', self.name

Ở đây __init__hoạt động như một hàm tạo cho lớp và khi một đối tượng được khởi tạo, hàm này được gọi. selfđại diện cho đối tượng khởi tạo.

c = Cat['Kitty']
c.info[]

Kết quả của các tuyên bố trên sẽ như sau:

I am a cat and I am called Kitty

7 hữu ích 0 bình luận chia sẻ

answer

6

Chỉ là một bản demo cho câu hỏi.

class MyClass:

    def __init__[self]:
        print['__init__ is the constructor for a class']

    def __del__[self]:
        print['__del__ is the destructor for a class']

    def __enter__[self]:
        print['__enter__ is for context manager']
        return self

    def __exit__[self, exc_type, exc_value, traceback]:
        print['__exit__ is for context manager']

    def greeting[self]:
        print['hello python']


if __name__ == '__main__':
    with MyClass[] as mycls:
        mycls.greeting[]
$ python3 class.objects_instantiation.py
__init__ is the constructor for a class
__enter__ is for context manager
hello python
__exit__ is for context manager
__del__ is the destructor for a class

6 hữu ích 1 bình luận chia sẻ

answer

5

Python __init__selfhọ làm gì?

Không gì selflàm gì? Nó có nghĩa là gì? Có bắt buộc không?

Không những gì __init__phương pháp làm gì? Tại sao cần thiết? [v.v.]

Ví dụ đưa ra là không chính xác, vì vậy hãy để tôi tạo một ví dụ chính xác dựa trên nó:

class SomeObject[object]:

    def __init__[self, blah]:
        self.blah = blah

    def method[self]:
        return self.blah 

Khi chúng ta tạo một thể hiện của đối tượng, lệnh __init__được gọi để tùy chỉnh đối tượng sau khi nó được tạo. Đó là, khi chúng ta gọi SomeObjectvới 'blah'bên dưới [có thể là bất cứ điều gì], nó sẽ được chuyển đến __init__hàm dưới dạng đối số , blah:

an_object = SomeObject['blah']

Đối selfsố là ví dụ của SomeObjectđiều đó sẽ được gán cho an_object.

Sau đó, chúng ta có thể muốn gọi một phương thức trên đối tượng này:

an_object.method[]

Thực hiện tra cứu chấm, nghĩa là, an_object.methodliên kết thể hiện với một thể hiện của hàm và phương thức [như đã gọi ở trên] bây giờ là một phương thức "bị ràng buộc" - có nghĩa là chúng ta không cần phải truyền rõ ràng thể hiện cho lệnh gọi phương thức .

Cuộc gọi phương thức lấy ví dụ bởi vì nó bị ràng buộc trong tra cứu chấm và khi được gọi, sau đó thực thi bất kỳ mã nào nó được lập trình để thực hiện.

Các selfđối số ngầm thông qua được gọi selftheo quy ước. Chúng tôi có thể sử dụng bất kỳ tên Python hợp pháp nào khác, nhưng bạn có thể sẽ bị xóa bởi các lập trình viên Python khác nếu bạn đổi nó thành tên khác.

__init__là một phương pháp đặc biệt, được ghi lại trong tài liệu của datamodel Python . Nó được gọi ngay sau khi thể hiện được tạo ra [thường là thông qua __new__- mặc dù __new__không bắt buộc trừ khi bạn đang phân lớp một kiểu dữ liệu bất biến].

5 hữu ích 0 bình luận chia sẻ

answer

4

Không gì tự làm gì? có nghĩa là gì? bắt buộc không?

Đối số đầu tiên của mọi phương thức lớp, bao gồm init, luôn là một tham chiếu đến thể hiện hiện tại của clas s. Theo quy ước, đối số này luôn được đặt tên là self. Trong phương thức init, self đề 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 cá thể có phương thức được gọi.

Python không ép buộc bạn sử dụng " tự ". Bạn có thể đặt cho nó bất kỳ tên nào bạn muốn. Nhưng hãy nhớ rằng đối số đầu tiên trong định nghĩa phương thức là tham chiếu đến đối tượng.Python thêm đối số tự vào danh sách cho bạn; bạn không cần bao gồm nó khi bạn gọi các phương thức. nếu bạn không tự cung cấp phương thức init thì bạn sẽ gặp lỗi

TypeError: __init___[] takes no arguments [1 given]

Không những gì init phương pháp làm gì? Tại sao cần thiết? [v.v.]

init viết tắt. Nó là một hàm tạo được gọi khi bạn tạo thể hiện của lớp và nó không cần thiết . Nhưng thông thường, chúng ta thực hành viết phương thức init để thiết lập trạng thái mặc định của đối tượng. Nếu ban đầu bạn không sẵn sàng đặt bất kỳ trạng thái nào của đối tượng thì bạn không cần phải viết phương thức này.

4 hữu ích 0 bình luận chia sẻ

Chủ Đề