Tôi có thể sử dụng bản thân bên ngoài lớp Python không?

Trong lập trình hướng đối tượng, khi chúng ta thiết kế một lớp, chúng ta sử dụng biến đối tượng và biến lớp.

Trong Class, các thuộc tính có thể được định nghĩa thành hai phần

  • Biến thể hiện. Nếu giá trị của một biến thay đổi từ đối tượng này sang đối tượng khác, thì các biến đó được gọi là biến thể hiện
  • Biến lớp. Biến lớp là một biến được khai báo bên trong lớp, nhưng bên ngoài bất kỳ phương thức thể hiện nào hoặc phương thức 
    Emma 10 ABC School
    Jessa 20 ABC School 
    9

Sau khi đọc bài viết này, bạn sẽ học được

  • Cách tạo và truy cập các biến lớp
  • Sửa đổi giá trị của một biến lớp
  • Biến thể hiện so với. biến lớp
  • Hành vi của một biến lớp trong kế thừa

Mục lục

Biến lớp trong Python là gì?

Nếu giá trị của một biến không thay đổi từ đối tượng này sang đối tượng khác, thì các loại biến như vậy được gọi là biến lớp hoặc biến tĩnh

Các biến lớp được chia sẻ bởi tất cả các phiên bản của một lớp. Không giống như biến thể hiện, giá trị của biến lớp không thay đổi từ đối tượng này sang đối tượng khác,

Trong Python, các biến Lớp được khai báo khi một lớp đang được xây dựng. Chúng không được định nghĩa bên trong bất kỳ phương thức nào của một lớp vì điều này chỉ có một bản sao của biến tĩnh sẽ được tạo và chia sẻ giữa tất cả các đối tượng của lớp

Ví dụ, trong lớp Sinh viên, chúng ta có thể có các biến thể hiện khác nhau như tên và số điểm danh vì tên và số điểm danh của mỗi sinh viên là khác nhau

Tuy nhiên, nếu chúng ta muốn đưa tên trường vào lớp học sinh, chúng ta phải sử dụng biến lớp thay vì biến thể hiện vì tên trường giống nhau đối với tất cả học sinh. Vì vậy, thay vì duy trì bản sao riêng biệt trong từng đối tượng, chúng ta có thể tạo một biến lớp chứa tên trường để tất cả học sinh (đối tượng) có thể chia sẻ nó

Chúng ta có thể thêm bất kỳ số lượng biến lớp nào trong một lớp

Tôi có thể sử dụng bản thân bên ngoài lớp Python không?
Tôi có thể sử dụng bản thân bên ngoài lớp Python không?
Hiểu các biến lớp

Tạo biến lớp

Một biến lớp được khai báo bên trong lớp, nhưng bên ngoài bất kỳ phương thức thể hiện nào hoặc phương thức 

Emma 10 ABC School
Jessa 20 ABC School 
9

Theo quy ước, thông thường nó được đặt ngay bên dưới tiêu đề lớp và trước phương thức khởi tạo và các phương thức khác

Ví dụ

class Student:
    # Class variable
    school_name = 'ABC School '
    
    def __init__(self, name, roll_no):
        self.name = name
        self.roll_no = roll_no

# create first object
s1 = Student('Emma', 10)
print(s1.name, s1.roll_no, Student.school_name)
# access class variable

# create second object
s2 = Student('Jessa', 20)
# access class variable
print(s2.name, s2.roll_no, Student.school_name)

đầu ra

Emma 10 ABC School
Jessa 20 ABC School 

Trong ví dụ trên, chúng ta đã tạo biến lớp

class Student:
    # Class variable
    school_name = 'ABC School '

    # constructor
    def __init__(self, name):
        self.name = name
        # access class variable inside constructor using self
        print(self.school_name)
        # access using class name
        print(Student.school_name)

# create Object
s1 = Student('Emma')
1 và truy cập nó bằng đối tượng và tên lớp

Ghi chú. Giống như các biến thông thường, các biến lớp có thể lưu trữ dữ liệu thuộc bất kỳ loại nào. Chúng ta có thể sử dụng danh sách Python, bộ dữ liệu Python và từ điển Python làm biến lớp

Truy cập các biến lớp

Chúng ta có thể truy cập các biến tĩnh theo tên lớp hoặc theo tham chiếu đối tượng, nhưng nên sử dụng tên lớp

Trong Python, chúng ta có thể truy cập biến lớp ở những nơi sau

  • Truy cập bên trong hàm tạo bằng cách sử dụng tham số
    class Student:
        # Class variable
        school_name = 'ABC School '
    
        # constructor
        def __init__(self, name):
            self.name = name
            # access class variable inside constructor using self
            print(self.school_name)
            # access using class name
            print(Student.school_name)
    
    # create Object
    s1 = Student('Emma')
    2 hoặc tên lớp
  • Truy cập biến lớp bên trong phương thức thể hiện bằng cách sử dụng một trong hai tên lớp
  • Truy cập từ bên ngoài lớp bằng cách sử dụng tham chiếu đối tượng hoặc tên lớp

ví dụ 1. Biến lớp truy cập trong hàm tạo

class Student:
    # Class variable
    school_name = 'ABC School '

    # constructor
    def __init__(self, name):
        self.name = name
        # access class variable inside constructor using self
        print(self.school_name)
        # access using class name
        print(Student.school_name)

# create Object
s1 = Student('Emma')

đầu ra

ABC School 
ABC School

ví dụ 2. Truy cập biến lớp trong phương thức Instance và lớp bên ngoài

________số 8_______

đầu ra

Inside instance method
Emma 10 ABC School 
ABC School 

Outside class
ABC School 
ABC School 

Trong ví dụ này, chúng tôi đã truy cập biến lớp

class Student:
    # Class variable
    school_name = 'ABC School '

    # constructor
    def __init__(self, name):
        self.name = name
        # access class variable inside constructor using self
        print(self.school_name)
        # access using class name
        print(Student.school_name)

# create Object
s1 = Student('Emma')
1 bằng cách sử dụng tên lớp và từ khóa
class Student:
    # Class variable
    school_name = 'ABC School '

    # constructor
    def __init__(self, name):
        self.name = name
        # access class variable inside constructor using self
        print(self.school_name)
        # access using class name
        print(Student.school_name)

# create Object
s1 = Student('Emma')
2 bên trong một phương thức

Sửa đổi biến lớp

Nói chung, chúng tôi gán giá trị cho một biến lớp bên trong khai báo lớp. Tuy nhiên, chúng ta có thể thay đổi giá trị của biến lớp dù trong lớp hay ngoài lớp

Ghi chú. Chúng ta chỉ nên thay đổi giá trị của biến lớp bằng tên lớp

Ví dụ

class Student:
    # Class variable
    school_name = 'ABC School '

    # constructor
    def __init__(self, name, roll_no):
        self.name = name
        self.roll_no = roll_no

    # Instance method
    def show(self):
        print(self.name, self.roll_no, Student.school_name)

# create Object
s1 = Student('Emma', 10)
print('Before')
s1.show()

# Modify class variable
Student.school_name = 'XYZ School'
print('After')
s1.show()

đầu ra

Before
Emma 10 ABC School 

After
Emma 10 XYZ School

Ghi chú

Cách tốt nhất là sử dụng tên lớp để thay đổi giá trị của biến lớp. Bởi vì nếu chúng ta cố gắng thay đổi giá trị của biến lớp bằng cách sử dụng một đối tượng, thì một biến thể hiện mới sẽ được tạo cho đối tượng cụ thể đó, biến này sẽ che khuất các biến lớp

Ví dụ

class Student:
    # Class variable
    school_name = 'ABC School '

    # constructor
    def __init__(self, name, roll_no):
        self.name = name
        self.roll_no = roll_no

# create Objects
s1 = Student('Emma', 10)
s2 = Student('Jessa', 20)

print('Before')
print(s1.name, s1.roll_no, s1.school_name)
print(s2.name, s2.roll_no, s2.school_name)

# Modify class variable using object reference
s1.school_name = 'PQR School'
print('After')
print(s1.name, s1.roll_no, s1.school_name)
print(s2.name, s2.roll_no, s2.school_name)

đầu ra

Before
Emma 10 ABC School 
Jessa 20 ABC School 

After
Emma 10 PQR School
Jessa 20 ABC School 

Một biến thể hiện mới được tạo cho đối tượng s1 và biến này che khuất các biến lớp. Vì vậy, hãy luôn sử dụng tên lớp để sửa đổi biến lớp

Biến lớp so với biến thể hiện

Bảng sau đây cho thấy sự khác biệt giữa biến thể hiện và biến lớp

Trong Python, các thuộc tính có thể được định nghĩa thành hai phần

  • Biến thể hiện. Giá trị của biến thể hiện thay đổi từ đối tượng này sang đối tượng khác. Các biến thể hiện không được chia sẻ bởi các đối tượng. Mỗi đối tượng có bản sao riêng của thuộc tính thể hiện
  • Biến lớp. Biến lớp là một biến được khai báo bên trong lớp, nhưng bên ngoài bất kỳ phương thức thể hiện nào hoặc phương thức 
    Emma 10 ABC School
    Jessa 20 ABC School 
    9. Các biến lớp được chia sẻ bởi tất cả các phiên bản của một lớp

Đọc thêm. Biến thể hiện trong Python với các ví dụ

Instance VariableClass BiếnInstance không được chia sẻ bởi các đối tượng. Mỗi đối tượng có bản sao riêng của thuộc tính thể hiệnCác biến lớp được chia sẻ bởi tất cả các thể hiện
Các biến thể hiện được khai báo bên trong hàm tạo i. e. , phương pháp
Emma 10 ABC School
Jessa 20 ABC School 
9. Các biến lớp được khai báo bên trong định nghĩa lớp nhưng bên ngoài bất kỳ phương thức thể hiện và hàm tạo nào. Nó được tạo khi một thể hiện của lớp được tạo. Nó được tạo khi chương trình bắt đầu thực thi. Những thay đổi được thực hiện đối với các biến này thông qua một đối tượng sẽ không phản ánh trong một đối tượng khác. Những thay đổi được thực hiện trong biến lớp sẽ phản ánh trong tất cả các đối tượng. Biến lớp so với. Biến thể hiện

Ví dụ

Hãy xem ví dụ để tạo một biến lớp và biến thể hiện

Emma 10 ABC School
Jessa 20 ABC School 
0

đầu ra

Emma 10 ABC School
Jessa 20 ABC School 
1

Biến lớp trong kế thừa

Như bạn đã biết, chỉ một bản sao của biến lớp sẽ được tạo và chia sẻ giữa tất cả các đối tượng của lớp đó

Khi chúng ta sử dụng tính kế thừa, tất cả các biến và phương thức của lớp cơ sở đều có sẵn cho lớp con. Trong những trường hợp như vậy, chúng ta cũng có thể thay đổi giá trị biến lớp của lớp cha trong lớp con

Chúng ta có thể sử dụng tên lớp cha hoặc tên lớp con để thay đổi giá trị của biến lớp cha trong lớp con

Ví dụ

Emma 10 ABC School
Jessa 20 ABC School 
2

đầu ra

Emma 10 ABC School
Jessa 20 ABC School 
3

Điều gì sẽ xảy ra nếu cả lớp con và lớp cha có cùng tên biến lớp. Trong trường hợp này, lớp con sẽ không kế thừa biến lớp của lớp cơ sở. Vì vậy nên tạo một biến lớp riêng cho lớp con thay vì kế thừa biến lớp cơ sở

Ví dụ

Emma 10 ABC School
Jessa 20 ABC School 
4

đầu ra

Emma 10 ABC School
Jessa 20 ABC School 
5

Sử dụng sai các biến lớp

Trong Python, chúng ta nên sử dụng đúng biến lớp vì tất cả các đối tượng đều có chung một bản sao. Do đó, nếu một trong các đối tượng sửa đổi giá trị của một biến lớp, thì tất cả các đối tượng bắt đầu tham chiếu đến bản sao mới

Ví dụ,

Ví dụ

Emma 10 ABC School
Jessa 20 ABC School 
6

đầu ra

Emma 10 ABC School
Jessa 20 ABC School 
7

Trong ví dụ trên, biến thể hiện

class Student:
    # Class variable
    school_name = 'ABC School '

    # constructor
    def __init__(self, name):
        self.name = name
        # access class variable inside constructor using self
        print(self.school_name)
        # access using class name
        print(Student.school_name)

# create Object
s1 = Student('Emma')
7 là duy nhất cho mỗi người chơi. Biến lớp
class Student:
    # Class variable
    school_name = 'ABC School '

    # constructor
    def __init__(self, name):
        self.name = name
        # access class variable inside constructor using self
        print(self.school_name)
        # access using class name
        print(Student.school_name)

# create Object
s1 = Student('Emma')
8 và
class Student:
    # Class variable
    school_name = 'ABC School '

    # constructor
    def __init__(self, name):
        self.name = name
        # access class variable inside constructor using self
        print(self.school_name)
        # access using class name
        print(Student.school_name)

# create Object
s1 = Student('Emma')
9 có thể được truy cập và sửa đổi bởi bất kỳ đối tượng nào

Bởi vì cả hai đối tượng đã sửa đổi biến lớp, nên một biến thể hiện mới được tạo cho đối tượng cụ thể đó có cùng tên với biến lớp, biến này che khuất các biến lớp

Trong trường hợp của chúng tôi, đối với đối tượng

ABC School 
ABC School
0 biến đối tượng mới
ABC School 
ABC School
1 được tạo và đối với đối tượng
ABC School 
ABC School
2 biến đối tượng mới
class Student:
    # Class variable
    school_name = 'ABC School '

    # constructor
    def __init__(self, name):
        self.name = name
        # access class variable inside constructor using self
        print(self.school_name)
        # access using class name
        print(Student.school_name)

# create Object
s1 = Student('Emma')
9 được tạo

Vì vậy, khi bạn cố gắng truy cập biến lớp bằng cách sử dụng đối tượng

ABC School 
ABC School
0 hoặc
ABC School 
ABC School
2, nó sẽ không trả về giá trị thực của biến lớp

Để tránh điều này, hãy luôn sửa đổi giá trị biến lớp bằng cách sử dụng tên lớp để tất cả các đối tượng nhận được giá trị cập nhật. Như thế này

Một phương pháp có thể được sử dụng bên ngoài một lớp học?

Bạn có thể có các phương thức công khai trong các lớp không công khai , nhưng bạn có thể không muốn điều đó vì các lớp không công khai sẽ bị hạn chế (có lẽ không có) khả năng hiển thị bên ngoài .

Khi nào tôi nên sử dụng self trong Python?

Vì vậy, SELF nên được sử dụng khi bạn xác định một phương thức cá thể, vì nó được truyền tự động làm tham số đầu tiên khi phương thức được gọi. Bạn cũng nên sử dụng self trong Python khi tham chiếu một thuộc tính lớp từ bên trong một phương thức thể hiện

Tôi có thể định nghĩa một hàm bên ngoài lớp trong Python không?

Có, bạn chắc chắn có thể có các hàm bên ngoài lớp học .

Chúng ta có thể sử dụng bất cứ thứ gì thay vì tự Python không?

Ghi chú. Từ self không phải là một từ khóa, mà nó là một quy ước được sử dụng bởi các nhà phát triển Python. Bạn chỉ cần sử dụng bất kỳ từ nào khác làm tham số đầu tiên và từ đó vẫn sẽ thực hiện công việc . Tuy nhiên, tốt hơn là sử dụng self thay vì bất kỳ thứ gì khác vì nó cải thiện khả năng đọc mã.