Python phương thức tĩnh là gì?

Bạn đang cố hiểu khái niệm về phương thức tĩnh và phương thức lớp trong Python?

Một phương thức tĩnh không thể truy cập các thuộc tính lớp hoặc thuộc tính thể hiện. Nó tương đương với một hàm bình thường nhưng nó là một phần của một lớp vì nó có chung ngữ cảnh logic. Một phương thức lớp không thể truy cập các thuộc tính thể hiện và nó thường được sử dụng làm phương thức xuất xưởng

Trong hướng dẫn này, bạn sẽ thấy rõ cách sử dụng các phương thức lớp và tĩnh so với các phương thức thể hiện tiêu chuẩn

Hãy viết mã

Mục lục

  • Phương thức tĩnh trong Python là gì?
  • Thuộc tính đối tượng truy cập phương thức tĩnh có thể không?
  • Phương thức lớp trong Python là gì?
  • Khi nào nên sử dụng Phương thức tĩnh so với Hàm trong Python
  • Các phương thức tĩnh có thể được kế thừa trong Python không?
  • Các phương thức lớp có thể được kế thừa trong Python không?
  • Sự kết luận

Phương thức tĩnh trong Python là gì?

Một phương thức tĩnh là một phương thức mà bạn có thể gọi mà không cần tạo một thể hiện của một lớp. Nó giống như một chức năng tiêu chuẩn bên trong một lớp. Các phương thức tĩnh hoạt động như các phương thức tiện ích cho một lớp

Để hiểu phương thức tĩnh trông như thế nào, hãy bắt đầu từ lớp Python đại diện cho phim

Lớp này có một hàm tạo và một phương thức thể hiện cơ bản để in một mô tả ngắn gọn về một bộ phim

class Movie:
    def __init__[self, name, release_year]:
        self.name = name
        self.release_year = release_year

    def get_description[self]:
        print[f"The value of self is {self}."]
        print[f"The movie {self.name} was released in {self.release_year}."]

Khi bạn định nghĩa một phương thức thể hiện trong một lớp, phương thức đó sẽ nhận self làm đối số đầu tiên trong đó self là thể hiện của lớp mà phương thức đó được gọi

Lưu ý rằng trong phương thức thể hiện, chúng tôi cũng đang in giá trị của bản thân để tôi có thể cho bạn thấy những gì bên trong nó

Bây giờ hãy tạo một thể hiện của lớp này và gọi phương thức

get_description[] trong trường hợp đó.
movie = Movie["Rambo", "1982"]
movie.get_description[]

[output]
The value of self is .
The movie Rambo was released in 1982.

Từ đầu ra, bạn có thể thấy rằng self là một đối tượng Movie, hay nói cách khác, một thể hiện của lớp Movie

Và bây giờ hãy tạo một phương thức ví dụ khác gọi là get_years_from_release[] sẽ cho chúng ta biết số năm đã trôi qua kể từ ngày phát hành của một bộ phim

def get_years_from_release[self]:
    return datetime.datetime.now[].year - int[self.release_year]

Ghi chú. hãy nhớ nhập mô-đun ngày giờ nếu không bạn sẽ thấy ngoại lệ "tên không được xác định"

Hãy sử dụng phương pháp này để in một thông báo cho biết bộ phim của chúng ta bao nhiêu tuổi…

movie = Movie["Rambo", "1982"]
print[f"The movie {movie.name} is {movie.get_years_from_release[]} years old."]

[output]
The movie Rambo is 40 years old.

thật tuyệt

Bây giờ, hãy làm một thí nghiệm nhỏ…

Chúng tôi sẽ thêm trình trang trí @staticmethod vào phương thức này và thử thực hiện lại nó

Chúng tôi nhận lại lỗi sau

Traceback [most recent call last]:
  File "static_class_methods.py", line 17, in 
    print[f"The movie {movie.name} is {movie.get_years_from_release[]} years old."]
TypeError: get_years_from_release[] missing 1 required positional argument: 'self'

Nguyên nhân của lỗi này là do một phương thức thể hiện, khi được gọi, sẽ chuyển hoàn toàn thể hiện dưới dạng tham số self

Nhưng điều tương tự không xảy ra khi bạn trang trí một phương thức với @staticmethod

Đó là bởi vì…

Một phương thức tĩnh không dành riêng cho một thể hiện của một lớp và đó là lý do tại sao tham số self không áp dụng cho nó

Một phương thức tĩnh không nhận self làm đối số đầu tiên, nó hoạt động giống như một hàm đơn giản với điểm khác biệt duy nhất là nó là một phần của lớp

Dựa trên điều này, chúng tôi sẽ

  • Xóa đối số self khỏi phương thức tĩnh
  • Chuyển năm phát hành phim làm đối số cho phương thức tĩnh vì chúng ta không thể tham chiếu đến bản thân. release_year trong phương thức [phương thức tĩnh không có quyền truy cập vào self]
@staticmethod
def get_years_from_release[release_year]:
    return datetime.datetime.now[].year - int[release_year]

Lần này đầu ra của phương thức là chính xác

movie = Movie["Rambo", "1982"]
print[f"The movie {movie.name} is {movie.get_years_from_release[movie.release_year]} years old."]

[output]
The movie Rambo is 40 years old.

Ghi chú. ở đây chúng ta phải vượt qua bộ phim. release_year sang phương thức tĩnh trong khi trước đó, trong phương thức cá thể, năm phát hành được tự động đọc từ cá thể bằng cách sử dụng self. năm phát hành

Và bên dưới bạn có thể thấy rằng chúng ta cũng có thể gọi phương thức tĩnh bằng cách sử dụng lớp thay vì thể hiện

Đầu ra không thay đổi

print[f"The movie {movie.name} is {Movie.get_years_from_release[movie.release_year]} years old."]

[output]
The movie Rambo is 40 years old.

Lý do tại sao bạn định nghĩa một phương thức tĩnh trong một lớp là phương thức đó có liên quan logic với chính lớp đó

Đây là cách mã của chúng tôi cho đến nay

________số 8

Thuộc tính đối tượng truy cập phương thức tĩnh có thể không?

Đây là điều chúng ta đã thấy trong phần trước…

Nhưng sự lặp lại là tốt để đảm bảo khái niệm này rõ ràng

Các phương thức tĩnh trong Python không thể truy cập các thuộc tính của cá thể bởi vì, khác với các phương thức của cá thể, chúng không nhận self làm đối số

Trong phần tiếp theo, tôi sẽ chỉ cho bạn một loại phương thức khác mà bạn có thể tạo trong lớp Python của mình, một phương thức khác với phương thức thể hiện hoặc phương thức tĩnh

Phương thức lớp trong Python là gì?

Một loại phương thức khác mà bạn có thể tạo trong lớp Python là phương thức lớp

Để tôi nói cho bạn biết thêm về nó…

Một phương thức lớp là một phương thức ngầm nhận lớp làm đối số đầu tiên. Các phương thức lớp thường được sử dụng làm phương thức xuất xưởng. Nói cách khác, chúng được sử dụng để tạo các thể hiện của một lớp tương tự như những gì một hàm tạo của lớp thực hiện

Một phương thức lớp nhận cls [một lớp] làm đối số đầu tiên giống như một phương thức thể hiện nhận self [một thể hiện của lớp] làm đối số đầu tiên

Đây là cách một phương thức lớp trông như thế nào

class MyClass:
    @classmethod
    def my_class_method[cls, arg1, arg2, ..., argN]:
        

Hãy thử tạo một phương thức lớp tương tự như những gì chúng ta đã làm trong phần trước với một phương thức tĩnh

Nhưng trước khi làm điều đó, chúng ta sẽ thêm một thuộc tính thể hiện khác vào lớp của chúng ta. thể loại phim

Đây là mã được cập nhật…

movie = Movie["Rambo", "1982"]
movie.get_description[]

[output]
The value of self is .
The movie Rambo was released in 1982.
0

Hãy thử tạo một thể hiện và gọi cả hai phương thức để đảm bảo mã này hoạt động

movie = Movie["Rambo", "1982"]
movie.get_description[]

[output]
The value of self is .
The movie Rambo was released in 1982.
1

Hãy thêm một phương thức lớp mà chúng ta có thể sử dụng để tạo phim hành động…

movie = Movie["Rambo", "1982"]
movie.get_description[]

[output]
The value of self is .
The movie Rambo was released in 1982.
2

Lưu ý rằng phương thức chúng ta đã tạo đang sử dụng trình trang trí @classmethod

Chúng tôi cũng đang in giá trị của cls để so sánh nó với giá trị của self trong đầu ra của chúng tôi

Gọi phương thức của lớp bằng tên lớp Movie

movie = Movie["Rambo", "1982"]
movie.get_description[]

[output]
The value of self is .
The movie Rambo was released in 1982.
3

Mã hoạt động tốt

Như bạn có thể thấy, chúng ta có thể tạo một thể hiện phim bằng phương thức lớp mới thay vì hàm tạo

Ngoài ra, bạn có thể thấy sự khác biệt giữa các giá trị của cls và self không?

Đối số cls là lớp gọi phương thức lớp. Bản thân Đối số là một thể hiện của lớp đó [hoặc một đối tượng]. Sử dụng cls và self là một quy ước đặt tên tiêu chuẩn giữa các nhà phát triển Python nhưng nó không phải là thứ mà trình thông dịch Python thực thi. Bạn có thể gọi chúng theo cách khác nhưng điều này sẽ khiến mã của bạn khó đọc hơn đối với các nhà phát triển khác

Khi nào nên sử dụng Phương thức tĩnh so với Hàm trong Python

Bạn có thể tự hỏi…

Tại sao bạn lại định nghĩa một phương thức tĩnh trong một lớp trong khi thực tế nó có thể là một hàm Python cơ bản?

Rốt cuộc, nó không nhận được bất kỳ đối số cụ thể nào của lớp hoặc cá thể như cls hoặc self

Chúng ta có thể thay thế một phương thức tĩnh bằng một hàm không?

Một hàm có thể thay thế một phương thức tĩnh và có những tình huống trong đó việc sử dụng một hàm sẽ hợp lý hơn. Ví dụ: nếu phương thức tĩnh chung chung đến mức nó có thể phù hợp với ngữ cảnh của nhiều lớp. Trong trường hợp đó, nó có thể là một chức năng riêng biệt được gọi bởi mỗi lớp khi cần thiết

Cũng thế…

Bạn sẽ định nghĩa một phương thức tĩnh trong một lớp thay vì sử dụng một hàm nếu phương thức đó quá cụ thể đối với những gì lớp của bạn thực hiện nên việc giữ nó trong lớp sẽ hợp lý hơn

Ví dụ…

Hãy lấy mã mới nhất của chúng tôi và chuyển đổi thông tin phương thức tĩnh thành một hàm để xem nó hoạt động như thế nào

movie = Movie["Rambo", "1982"]
movie.get_description[]

[output]
The value of self is .
The movie Rambo was released in 1982.
4

Di chuyển phương thức tĩnh ra ngoài lớp và xóa trình trang trí @staticmethod

Mã trở thành…

movie = Movie["Rambo", "1982"]
movie.get_description[]

[output]
The value of self is .
The movie Rambo was released in 1982.
5

Và cuối cùng, hãy gọi hàm này sau khi tạo một thể hiện của lớp Movie

movie = Movie["Rambo", "1982"]
movie.get_description[]

[output]
The value of self is .
The movie Rambo was released in 1982.
6

hoạt động tốt

Các phương thức tĩnh có thể được kế thừa trong Python không?

Tôi tự hỏi liệu chúng ta có thể kế thừa một phương thức tĩnh bên trong một lớp con không

Hãy cùng kiểm chứng…

Bắt đầu từ một phiên bản đơn giản hóa của lớp trước của chúng tôi

movie = Movie["Rambo", "1982"]
movie.get_description[]

[output]
The value of self is .
The movie Rambo was released in 1982.
7

Chúng tôi muốn xác minh xem một phương thức tĩnh có thể được kế thừa hay không

Vì vậy, hãy định nghĩa một lớp mới

không triển khai có tên là FantasyMovie kế thừa lớp Movie.
movie = Movie["Rambo", "1982"]
movie.get_description[]

[output]
The value of self is .
The movie Rambo was released in 1982.
8

Sau đó tạo một thể hiện của lớp này

Hãy xem liệu chúng ta có thể gọi phương thức tĩnh của lớp cha get_years_from_release[] hay không và liệu chúng ta có nhận được kết quả chính xác không

movie = Movie["Rambo", "1982"]
movie.get_description[]

[output]
The value of self is .
The movie Rambo was released in 1982.
9

chúng tôi làm

Điều này có nghĩa rằng…

Các phương thức tĩnh được kế thừa bởi một lớp con trong Python

Các phương thức lớp có thể được kế thừa trong Python không?

Hãy làm một bài kiểm tra tương tự như bài kiểm tra mà chúng ta đã làm trong phần trước nhưng lần này với một phương thức lớp

Bắt đầu với một lớp chỉ có hàm tạo và phương thức lớp

def get_years_from_release[self]:
    return datetime.datetime.now[].year - int[self.release_year]
0

Sau đó, sử dụng cùng một lớp con mà chúng ta đã tạo trước đó…

movie = Movie["Rambo", "1982"]
movie.get_description[]

[output]
The value of self is .
The movie Rambo was released in 1982.
8

Và gọi phương thức lớp bằng lớp con này

def get_years_from_release[self]:
    return datetime.datetime.now[].year - int[self.release_year]
2

Như bạn có thể thấy, chúng tôi đã tạo phiên bản thành công ngay cả khi tại thời điểm này, chúng tôi đang kết hợp hai thể loại phim. Giả tưởng và Hành động

Sau tất cả, đây chỉ là một ví dụ để cho bạn thấy rằng bạn có thể gọi một phương thức lớp từ một lớp con

Các phương thức lớp được kế thừa bởi một lớp con trong Python

Sự kết luận

Hãy tóm tắt lại cách phương thức thể hiện, phương thức lớp và phương thức tĩnh khác nhau dựa trên đối số đầu tiên của chúng

  • phương thức sơ thẩm. nhận thể hiện làm đối số đầu tiên [bản thân]
  • phương pháp lớp. nhận lớp làm đối số đầu tiên [cls]
  • phương pháp tĩnh. không nhận được bất kỳ đối số đặc biệt nào

Và bây giờ là lúc để bạn bắt đầu sử dụng các phương thức này trong mã của mình. 🙂

Tiếp tục viết mã và tiếp tục học hỏi

Bài viết liên quan

Cách triển khai thuật toán tìm kiếm nhị phân trong Python

Cách kiểm tra xem chuỗi Python có chứa chuỗi con không

Lỗi đệ quy Python. Đã vượt quá độ sâu đệ quy tối đa. Tại sao?

Claudio Sabato

Tôi là Trưởng nhóm công nghệ, Kỹ sư phần mềm và Huấn luyện viên lập trình. Tôi muốn giúp bạn trong hành trình trở thành Nhà phát triển siêu hạng

Tại sao phương thức tĩnh được sử dụng trong Python?

Một phương thức tĩnh là một phương thức tiện ích chung thực hiện một tác vụ trong sự cô lập. Các phương thức tĩnh trong Python tương tự như các phương thức được tìm thấy trong Java hoặc C++. Một phương thức tĩnh được liên kết với lớp chứ không phải đối tượng của lớp. Do đó, chúng ta có thể gọi nó bằng tên lớp

Phương thức tĩnh là gì?

Phương thức tĩnh [hoặc hàm tĩnh] là phương thức được định nghĩa là thành viên của đối tượng nhưng có thể truy cập trực tiếp từ hàm tạo của đối tượng API, thay vì từ phiên bản đối tượng được tạo thông qua . .

Phương pháp tĩnh với ví dụ là gì?

Một phương thức tĩnh trong Java là một phương thức là một phần của lớp chứ không phải là một thể hiện của lớp đó . Mọi thể hiện của một lớp đều có quyền truy cập vào phương thức. Các phương thức tĩnh có quyền truy cập vào các biến lớp [biến tĩnh] mà không cần sử dụng đối tượng của lớp [thể hiện]. Chỉ dữ liệu tĩnh có thể được truy cập bằng một phương thức tĩnh.

Phương thức tĩnh và phương thức lớp trong Python là gì?

Các phương thức lớp không cần một thể hiện của lớp. Họ không thể truy cập thể hiện [ self ] nhưng họ có quyền truy cập vào chính lớp thông qua cls. Các phương thức tĩnh không có quyền truy cập vào cls hoặc self. Chúng hoạt động giống như các hàm thông thường nhưng thuộc về không gian tên của lớp

Chủ Đề