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.

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):
        pass
0 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):
        pass
2 đã đượ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):
        pass
3 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):
        pass
4 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):
        pass
5 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):
        pass
6.)

So:

file_1 = __class__().file_name

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):
        pass
7 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.)

  • Phương pháp tĩnh Python thuộc về lớp.
  • Chúng được sử dụng để tạo các phương thức tiện ích cho lớp.
  • Phương pháp tĩnh được gọi từ tham chiếu lớp.
  • Họ có thể thay đổi trạng thái của đối tượng vì chúng thuộc về lớp.
  • Trên thực tế, một phương thức tĩnh không có quyền truy cập vào các thuộc tính của lớp.
  • Phương pháp tĩnh giống như một hàm trong tập lệnh Python nhưng bên trong thân lớp.
  • Chúng ta có thể gọi một phương thức tĩnh từ tham chiếu lớp hoặc tham chiếu đối tượng. Nếu foo () là phương thức tĩnh trong các loại sử dụng lớp, chúng ta có thể gọi nó là
    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):
            pass
    
    8 cũng như
    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):
            pass
    
    9.

Tại sao chúng ta cần phương pháp tĩnh Python?

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.

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):
        pass

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'))  # PYTHON
0. 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'))  # PYTHON
1.


Cách tạo phương thức tĩnh trong Python

Python cung cấp hai cách để tạo ra một phương thức tĩnh.

  1. Phương thức staticMethod ()
  2. @StaticMethod Chức năng trang trí

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'))  # PYTHON

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
Phươ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ì.

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
Python @staticmethod trang trí


  • Phương pháp lớp Python có thể truy cập các biến lớp nhưng phương thức tĩnh có thể truy cập các biến lớp.
  • Một phương thức lớp yêu cầu tham số chính thức đầu tiên liên kết với lớp. Một phương pháp tĩnh có thể có mặt mà không có bất kỳ tham số nào.
  • Chúng tôi sử dụng @ClassMethod để tạo các phương thức lớp. Chúng tôi sử dụng @staticmethod để tạo các phương thức tĩnh.

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

  • Phương thức thể hiện trong lớp có thể truy cập các biến thể hiện cũng như các biến lớp. Phương thức tĩnh có thể truy cập các biến lớp hoặc biến thể hiện.
  • Chúng tôi yêu cầu biến bản thân của người Viking là tham số chính thức cho phương thức thể hiện. Không có hạn chế như vậy với phương pháp tĩnh.
  • Chúng tôi sử dụng công cụ trang trí @staticmethod để tạo phương pháp tĩnh. Chúng tôi không cần bất kỳ nhà trang trí để tạo chức năng 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 Python

Cá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:

  • Tài liệu chính thức

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.