Hướng dẫn use instance variable in static method python - sử dụng biến cá thể trong python phương thức tĩnh
Nếu bạn nghĩ rằng bạn tiếp tục va vào các tình huống mà một staticmethod là phù hợp nhất, có lẽ bạn đã sai sử dụng tốt cho chúng là rất hiếm. Và nếu staticmethod của bạn cần truy cập các biến thể hiện, bạn chắc chắn sai. Show
Một staticmethod không thể truy cập các biến thể hiện trực tiếp. Không thể có trường hợp của lớp, hoặc hàng ngàn; Bạn sẽ truy cập các biến nào từ? Những gì bạn đang cố gắng làm là tạo một thể hiện mới, chỉ để truy cập các biến thể hiện của nó. Điều này đôi khi có thể hữu ích, mặc dù nó thường là một dấu hiệu tốt mà bạn không cần một lớp học ngay từ đầu. . Đó là hợp pháp, nhưng bạn làm điều đó bằng cách gọi lớp học, chứ không phải bằng cách gọi phương thức ____10 của nó. Rằng class ListUtils: @staticmethod def reverse(l): pass @staticmethod def clear(l): pass class StringUtils: @staticmethod def reverse(l): pass @staticmethod def upper(l): pass class TupleUtils: @staticmethod def reverse(t): pass @staticmethod def shuffle(t): pass0 không bao giờ trả lại bất cứ điều gì; Nó nhận được một class ListUtils: @staticmethod def reverse(l): pass @staticmethod def clear(l): pass class StringUtils: @staticmethod def reverse(l): pass @staticmethod def upper(l): pass class TupleUtils: @staticmethod def reverse(t): pass @staticmethod def shuffle(t): pass2 đã được tạo ra và sửa đổi nó. Nếu bạn thực sự muốn, bạn có thể gọi phương thức class ListUtils: @staticmethod def reverse(l): pass @staticmethod def clear(l): pass class StringUtils: @staticmethod def reverse(l): pass @staticmethod def upper(l): pass class TupleUtils: @staticmethod def reverse(t): pass @staticmethod def shuffle(t): pass3 của nó, nhưng điều đó thực sự chỉ có nghĩa là giống như gọi lớp. (Theo những cách nhỏ mà chúng khác nhau, nó gọi lớp mà bạn muốn.) Ngoài ra, một khi bạn đã có một thể hiện, bạn chỉ có thể sử dụng nó bình thường; Bạn không cần phải nhìn vào class ListUtils: @staticmethod def reverse(l): pass @staticmethod def clear(l): pass class StringUtils: @staticmethod def reverse(l): pass @staticmethod def upper(l): pass class TupleUtils: @staticmethod def reverse(t): pass @staticmethod def shuffle(t): pass4 của nó. (Ngay cả khi bạn chỉ có tên thuộc tính là biến chuỗi, class ListUtils: @staticmethod def reverse(l): pass @staticmethod def clear(l): pass class StringUtils: @staticmethod def reverse(l): pass @staticmethod def upper(l): pass class TupleUtils: @staticmethod def reverse(t): pass @staticmethod def shuffle(t): pass5 hầu như luôn luôn là những gì bạn muốn ở đó, không phải class ListUtils: @staticmethod def reverse(l): pass @staticmethod def clear(l): pass class StringUtils: @staticmethod def reverse(l): pass @staticmethod def upper(l): pass class TupleUtils: @staticmethod def reverse(t): pass @staticmethod def shuffle(t): pass6.) So:
Vì vậy, bạn nên làm gì thay thế? Vâng, nhìn vào thiết kế của bạn. Điều duy nhất mà một thể hiện class ListUtils: @staticmethod def reverse(l): pass @staticmethod def clear(l): pass class StringUtils: @staticmethod def reverse(l): pass @staticmethod def upper(l): pass class TupleUtils: @staticmethod def reverse(t): pass @staticmethod def shuffle(t): pass7 là giữ tên tệp, có giá trị mặc định. Bạn không cần một đối tượng cho điều đó, chỉ là một biến chuỗi cũ đơn giản mà bạn truyền vào hoặc lưu trữ dưới dạng toàn cầu. . câu trả lời.) Các phương pháp tĩnh cung cấp một cách để chia các phương thức tiện ích thành các mô-đun phụ riêng biệt. Hãy nói rằng chúng tôi có một mô -đun Python cho các phương thức tiện ích cho chuỗi, danh sách và tuple. Chúng ta có thể tạo các phương thức tĩnh trong các lớp riêng biệt để hiểu rõ hơn và dễ sử dụng. Nếu chúng ta phải đảo ngược một danh sách, chúng ta sẽ gọi phương thức class StringUtils: def to_uppercase(s): return str(s).upper() StringUtils.upper = staticmethod(StringUtils.to_uppercase) print(StringUtils.upper('Python')) # PYTHON0. Nếu chúng ta phải xáo trộn các phần tử tuple, chúng ta sẽ gọi phương thức tĩnh class StringUtils: def to_uppercase(s): return str(s).upper() StringUtils.upper = staticmethod(StringUtils.to_uppercase) print(StringUtils.upper('Python')) # PYTHON1. Cách tạo phương thức tĩnh trong PythonPython cung cấp hai cách để tạo ra một phương thức tĩnh.
1. Sử dụng hàm staticMethod ()StaticMethod () rất hữu ích khi bạn muốn tạo một phương thức tĩnh được xác định trong lớp. Lưu ý rằng phương pháp không nên có đối số tự. class StringUtils: def to_uppercase(s): return str(s).upper() StringUtils.upper = staticmethod(StringUtils.to_uppercase) print(StringUtils.upper('Python')) # PYTHON Nếu chúng ta cố gắng gọi phương thức to_upPercase () từ đối tượng StringUtils, nó sẽ gây ra lỗi vì phương thức lấy 1 đối số vị trí nhưng 2 đã được đưa ra. su = StringUtils() try: print(su.to_uppercase('Python')) except TypeError as te: print(te) # Output # to_uppercase() takes 1 positional argument but 2 were given Mặc dù vậy, chúng ta có thể gọi phương thức TO_UPPERCase () từ tham chiếu lớp. print(StringUtils.to_uppercase('Python')) # PYTHONPhương pháp tĩnh Python 2. Sử dụng chú thích @staticmethodĐây là cách được đề xuất để tạo ra một phương thức tĩnh. Chúng ta chỉ cần chú thích phương pháp với bộ trang trí @staticmethod. class MathUtils: @staticmethod def multiply(a, b): return a * b print(MathUtils.multiply(10, 5)) # 50 Cách tạo phương pháp tĩnh rất đơn giản để sử dụng, có thể đọc được và có thể duy trì. Python @staticmethod trang trí
class Test: x = 10 @classmethod def foo(cls): print(cls.x) @staticmethod def bar(): # Unresolved reference error for class variable x # print(x) pass Phương pháp tĩnh Python so với phương pháp thể hiện
class Test: x = 10 def func(self): print(type(self)) print(self.x) Lợi ích của phương pháp tĩnh trong PythonCác phương pháp tĩnh có lợi cho các phương thức tiện ích nhóm bên trong ranh giới lớp. Mặt khác, nó giống như một hàm bình thường trong tập lệnh Python. References:
Phương pháp tĩnh có thể sử dụng các biến thể hiện Python không?Một phương thức tĩnh không có quyền truy cập vào các biến lớp và phiên bản vì nó không nhận được đối số đầu tiên ngầm như bản thân và CLS. Do đó, nó không thể sửa đổi trạng thái của đối tượng hoặc lớp. Phương thức lớp có thể được gọi bằng cách sử dụng ClassName. Phương thức_name () cũng như bằng cách sử dụng một đối tượng của lớp. because it does not receive an implicit first argument like self and cls . Therefore it cannot modify the state of the object or class. The class method can be called using ClassName. method_name() as well as by using an object of the class.
Tôi có thể sử dụng biến thể hiện trong phương pháp tĩnh không?Một phương thức tĩnh không thể truy cập các biến thể hiện và phương thức thể hiện của lớp, bởi vì một phương thức tĩnh có thể được gọi ngay cả khi không có đối tượng nào của lớp được khởi tạo.Vì lý do tương tự, tham chiếu này không thể được sử dụng trong một phương thức tĩnh., because a static method can be called even when no objects of the class have been instantiated. For the same reason, the this reference cannot be used in a static method.
Tôi có thể gọi phương thức tĩnh với ví dụ trong Python không?Đằng sau hậu trường, Python chỉ đơn giản thực thi các hạn chế truy cập bằng cách không truyền vào đối số bản thân hoặc CLS khi một phương thức tĩnh được gọi bằng cú pháp DOT.Điều này xác nhận rằng các phương thức tĩnh không thể truy cập trạng thái thể hiện đối tượng cũng như trạng thái lớp.static methods can neither access the object instance state nor the class state.
Biến trường hợp có thể được giới thiệu từ khối tĩnh không?Chúng tôi không thể truy cập các biến thể hiện trực tiếp từ một phương thức tĩnh.Do đó, để truy cập một biến thể hiện, chúng ta phải có một thể hiện của lớp mà chúng ta truy cập vào biến thể hiện.. Therefore, to access an instance variable, we must have an instance of the class from which we access the instance variable. |