Hướng dẫn add method to class python - thêm phương thức vào lớp python

Lời nói đầu - Một lưu ý về khả năng tương thích: Các câu trả lời khác chỉ có thể hoạt động trong Python 2 - Câu trả lời này sẽ hoạt động hoàn toàn tốt trong Python 2 và 3. Nếu chỉ viết Python 3 tương tự.

Thêm một phương thức vào một thể hiện đối tượng hiện có

Tôi đã đọc rằng có thể thêm một phương thức vào một đối tượng hiện có (ví dụ: không phải trong định nghĩa lớp) trong Python.

Tôi hiểu rằng không phải lúc nào cũng là một quyết định tốt để làm như vậy. Nhưng, làm thế nào một người có thể làm điều này?But, how might one do this?

Vâng, nó là có thể - nhưng không được khuyến khích

Tôi không đề xuất điều này. Đây là một ý tưởng tồi. Đừng làm điều đó.

Đây là một vài lý do:

  • Bạn sẽ thêm một đối tượng ràng buộc vào mọi trường hợp bạn làm điều này. Nếu bạn làm điều này rất nhiều, có lẽ bạn sẽ lãng phí rất nhiều trí nhớ. Các phương thức ràng buộc thường chỉ được tạo ra trong thời gian ngắn của cuộc gọi của chúng và sau đó chúng ngừng tồn tại khi tự động rác được thu thập. Nếu bạn thực hiện điều này theo cách thủ công, bạn sẽ có một ràng buộc tên tham chiếu phương thức ràng buộc - điều này sẽ ngăn chặn bộ sưu tập rác của nó về việc sử dụng.
  • Các thể hiện đối tượng của một loại đã cho thường có các phương thức của nó trên tất cả các đối tượng thuộc loại đó. Nếu bạn thêm các phương thức ở nơi khác, một số trường hợp sẽ có các phương thức đó và các phương pháp khác thì không. Các lập trình viên sẽ không mong đợi điều này, và bạn có nguy cơ vi phạm quy tắc ít ngạc nhiên nhất.
  • Vì có những lý do thực sự tốt khác để không làm điều này, bạn cũng sẽ cho mình một danh tiếng kém nếu bạn làm điều đó.

Vì vậy, tôi đề nghị bạn không làm điều này trừ khi bạn có một lý do thực sự tốt. Tốt hơn nhiều là xác định phương thức chính xác trong định nghĩa lớp hoặc ít nhất là tốt nhất là trực tiếp cho khỉ, như thế này:It is far better to define the correct method in the class definition or less preferably to monkey-patch the class directly, like this:

Foo.sample_method = sample_method

Vì nó là hướng dẫn, tuy nhiên, tôi sẽ chỉ cho bạn một số cách để làm điều này.

Làm thế nào nó có thể được thực hiện

Đây là một số mã thiết lập. Chúng ta cần một định nghĩa lớp. Nó có thể được nhập khẩu, nhưng nó thực sự không quan trọng.

class Foo(object):
    '''An empty class to demonstrate adding a method to an instance'''

Tạo một thể hiện:

foo = Foo()

Tạo một phương thức để thêm vào nó:

def sample_method(self, bar, baz):
    print(bar + baz)

Phương thức Naught (0) - Sử dụng phương thức mô tả, class Foo(object): '''An empty class to demonstrate adding a method to an instance''' 6

Tra cứu chấm trên các hàm gọi phương thức

class Foo(object):
    '''An empty class to demonstrate adding a method to an instance'''
6 của hàm với thể hiện, liên kết đối tượng với phương thức và do đó tạo ra "phương thức ràng buộc".

foo.sample_method = sample_method.__get__(foo)

và bây giờ:

>>> foo.sample_method(1,2)
3

Phương thức một - type.methodtype

Đầu tiên, nhập các loại, từ đó chúng tôi sẽ có hàm tạo phương thức:

import types

Bây giờ chúng tôi thêm phương thức vào thể hiện. Để làm điều này, chúng tôi yêu cầu hàm tạo Phương thức từ mô -đun

class Foo(object):
    '''An empty class to demonstrate adding a method to an instance'''
8 (mà chúng tôi đã nhập ở trên).

Chữ ký đối số cho các loại.MethodType (trong Python 3) là

class Foo(object):
    '''An empty class to demonstrate adding a method to an instance'''
9:

foo.sample_method = types.MethodType(sample_method, foo)

và cách sử dụng:

>>> foo.sample_method(1,2)
3

Về mặt cha mẹ, trong Python 2 Chữ ký là

foo = Foo()
0:

foo.sample_method = types.MethodType(sample_method, foo, Foo)

Phương pháp hai: Binding từ vựng

Đầu tiên, chúng tôi tạo một hàm trình bao bọc liên kết phương thức với thể hiện:

class Foo(object):
    '''An empty class to demonstrate adding a method to an instance'''
0

usage:

class Foo(object):
    '''An empty class to demonstrate adding a method to an instance'''
1

Phương pháp ba: functools.partial

Hàm một phần áp dụng (các) đối số đầu tiên cho một hàm (và các đối số từ khóa tùy chọn) và sau đó có thể được gọi với các đối số còn lại (và ghi đè các đối số từ khóa). Do đó:

class Foo(object):
    '''An empty class to demonstrate adding a method to an instance'''
2

Điều này có ý nghĩa khi bạn xem xét rằng các phương thức ràng buộc là các chức năng một phần của thể hiện.

Hàm không bị ràng buộc như một thuộc tính đối tượng - tại sao điều này không hoạt động:

Nếu chúng ta cố gắng thêm sample_method theo cách tương tự như chúng ta có thể thêm nó vào lớp, thì nó không bị ràng buộc trong ví dụ và không coi bản thân ngầm là đối số đầu tiên.

class Foo(object):
    '''An empty class to demonstrate adding a method to an instance'''
3

Chúng ta có thể làm cho chức năng không liên kết hoạt động bằng cách vượt qua rõ ràng (hoặc bất cứ điều gì, vì phương pháp này không thực sự sử dụng biến đối số

foo = Foo()
1), nhưng nó sẽ không phù hợp với chữ ký dự kiến ​​của các trường hợp khác (nếu chúng ta vá trường hợp này):

class Foo(object):
    '''An empty class to demonstrate adding a method to an instance'''
4

Sự kết luận

Bây giờ bạn đã biết một số cách bạn có thể làm điều này, nhưng trong tất cả sự nghiêm túc - đừng làm điều này.

Phương thức __ Thêm __ trong Python là gì?

Phương thức Python __add __ () thêm hai đối tượng và trả về một đối tượng mới làm đối tượng kết quả trong Python. Ví dụ dưới đây trả về một đối tượng mới, Python3.adds two objects and returns a new object as a resultant object in Python. The below example returns a new object, Python3.

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

Phương pháp __init__ là tương đương Python của hàm tạo C ++ theo cách tiếp cận hướng đối tượng.Hàm __init__ được gọi mỗi khi một đối tượng được tạo từ một lớp.Phương thức __init__ cho phép lớp khởi tạo các thuộc tính của đối tượng và không phục vụ mục đích nào khác.Nó chỉ được sử dụng trong các lớp học.the Python equivalent of the C++ constructor in an object-oriented approach. The __init__ function is called every time an object is created from a class. The __init__ method lets the class initialize the object's attributes and serves no other purpose. It is only used within classes.

__ str __ trong Python là gì?

Python __str __ () Phương thức này trả về biểu diễn chuỗi của đối tượng.Phương thức này được gọi là hàm in () hoặc str () được gọi trên một đối tượng.Phương thức này phải trả về đối tượng chuỗi.This method returns the string representation of the object. This method is called when print() or str() function is invoked on an object. This method must return the String object.

__ Lớp __ trong Python là gì?

__ class__ là một thuộc tính trên đối tượng đề cập đến lớp mà từ đó đối tượng được tạo.một.__Class__ # Đầu ra: b.__Class__ # Đầu ra: Sau các loại dữ liệu đơn giản, giờ đây chúng ta hãy hiểu chức năng loại và __Class__ với sự trợ giúp của lớp do người dùng xác định, con người.an attribute on the object that refers to the class from which the object was created. a. __class__ # Output: b. __class__ # Output: After simple data types, let's now understand the type function and __class__ attribute with the help of a user-defined class, Human .