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ớpDự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ố 8Thuộ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.
0Hã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.
1Hã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.
2Lư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.
3Mã 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.
4Di 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.
5Và 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.
6hoạ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.
7Chú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.
8Sau đó 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.
9chú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 PythonCá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]
0Sau đó, 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.
8Và 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]
2Như 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 PythonSự 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