Hướng dẫn how to pass a class instance as a function argument in python - cách truyền một cá thể lớp làm đối số hàm trong python

Đây là cách nó hoạt động đối với tôi:

class SomeName:
  def __init__(self):
    self.value = "something"
  def some_method(self):
    print self.value

def external_func(instance, method):
  method(instance)

external_func(SomeName(), SomeName.some_method)

Điều này dường như hoạt động chính xác. Đây có phải là cách đúng đắn để làm điều này?

Đã hỏi ngày 15 tháng 7 năm 2015 lúc 11:42Jul 15, 2015 at 11:42

Hướng dẫn how to pass a class instance as a function argument in python - cách truyền một cá thể lớp làm đối số hàm trong python

4

Mã của bạn là "chính xác về mặt kỹ thuật" (nó thực hiện những gì bạn yêu cầu) nhưng - ít nhất là trong ví dụ của bạn - khá vô dụng:

def external_func(instance, method):
  method(instance)

external_func(SomeName(), SomeName.some_method)

giống như:

def external_func(method):
  method()

external_func(SomeName().some_method)

FWIW nào giống như:

SomeName().some_method()

Nhưng tôi cho rằng bạn đã hiểu điều này rồi.

Bây giờ bạn có thể có một lý do để cố gắng chuyển cả phương pháp và thể hiện cho external_func() hoặc có thể có một cách tốt hơn để giải quyết vấn đề thực sự của bạn ...

Đã trả lời ngày 15 tháng 7 năm 2015 lúc 12:05Jul 15, 2015 at 12:05

2

Tất nhiên tôi không biết chính xác thì bạn đang làm gì, nhưng nghe có vẻ như bạn đang cố gắng làm quá nhiều trong một chức năng. Vấn đề của bạn có thể được giải quyết tốt hơn bằng cách chia tách nội dung của external_func.

Các mục tiêu ở đây, như tôi hiểu chúng, bạn không biết trước cặp đối tượng/phương thức sẽ là gì và muốn giảm sự lặp lại mã.

Có lẽ một cái gì đó như thế này sẽ tốt hơn:

def main():
    obj = SomeName()
    # do the setting up portion 
    complex_object = external_func_set_up(obj)
    # presumably at some point you have to designate the method to be used:
    method = get_method_name(obj) 
    # run the method:
    getattr(obj, method)()
    # finish up the external operation: 
    external_func_complete(***args***) 

Tôi hiểu đây là mã nhiều hơn, nhưng tôi nghĩ cuối cùng, điều đó rõ ràng hơn rất nhiều về những gì đang xảy ra, và cũng có thể buộc bạn phải suy nghĩ thông qua vấn đề của bạn hơn một chút (và có khả năng đưa ra một giải pháp thậm chí còn tốt hơn).

Đã trả lời ngày 15 tháng 7 năm 2015 lúc 12:59Jul 15, 2015 at 12:59

Hướng dẫn how to pass a class instance as a function argument in python - cách truyền một cá thể lớp làm đối số hàm trong python

Tùy thuộc vào những gì bạn đang làm. Bởi vì các chức năng cũng là đối tượng trong Python nên có thể làm như vậy.

Nhưng nó có phải là một giải pháp tốt? Có vẻ như bạn đang cố gắng xử lý một vấn đề có thể được giải quyết tốt hơn với nhiều cách tiếp cận theo hướng đối tượng:good solution? It seems though that you're trying to handle a problem which maybe could be better solved with more of an object oriented approach:

class A:
    def __init__(self):
        self.value = "class A"
    def some_method(self):
        print self.value

class B:
    def __init__(self):
        self.value = "class B"
    def some_method(self):
        print self.value

some_class = A()
some_class.some_method()

some_class = B()
some_class.some_method()

Đầu ra:

"class A"
"class B"

Theo quan điểm của tôi, đây sẽ là một cách tiếp cận tốt hơn (nếu điều này là có thể/hợp lý trong trường hợp của bạn): Bạn chỉ cần gọi ____10 trong lớp của bạn, có thể thậm chí không biết loại đối tượng chính xác nào bạn đang xử lý (liên quan đến kế thừa). Bản thân lớp học biết phải làm gì và phản ứng tương ứng khi phương pháp của nó được gọi.

Điều này tất nhiên không hoạt động khi bạn làm việc với các thư viện bên ngoài mà bạn không có ảnh hưởng.

Đã trả lời ngày 15 tháng 7 năm 2015 lúc 11:59Jul 15, 2015 at 11:59

Adrianusadrianusadrianus

3.0611 Huy hiệu vàng21 Huy hiệu bạc40 Huy hiệu đồng1 gold badge21 silver badges40 bronze badges

4

class Vehicle:
    def __init__(self):
        self.trucks = []

    def add_truck(self, truck):
        self.trucks.append(truck)


class Truck:
    def __init__(self, color):
        self.color = color

    def __repr__(self):
        return "{}".format(self.color)


def main():
    v = Vehicle()
    for t in 'Red Blue Black'.split():
        t = Truck(t)
        v.add_truck(t)
    print(v.trucks)


if __name__ == "__main__":
    main()

Trong ví dụ, có hai lớp xe và xe tải, đối tượng của xe tải lớp được truyền dưới dạng tham số cho phương pháp của xe lớp. Trong phương thức chính () đối tượng của xe được tạo. Sau đó, phương thức add_truck () của xe lớp được gọi và đối tượng của lớp xe tải được truyền dưới dạng tham số.

Đầu ra mẫu của chương trình trên.

2020-11-17T05: 06: 09+05: 302020-11-17T05: 06: 09+05: 30Amit Aroraccothon Lập trình TutororythonPractical Solution 2020-11-17T05:06:09+05:30 Amit Arora Python Programming Tutorial Python Practical Solution

Làm cách nào để chuyển thể hiện một đối tượng như một đối số trong một hàm trong Python?

Khi bạn gọi một phương thức thể hiện (ví dụ: func) từ một đối tượng thể hiện (ví dụ: Inst), Python sẽ tự động chuyển đối tượng phiên bản đó làm đối số đầu tiên, ngoài bất kỳ đối số nào khác được người dùng truyền vào., in addition to any other arguments that were passed in by the user.

Làm thế nào để bạn vượt qua một lớp như một đối số cho một hàm trong Python?

Có của thô, bạn có thể vượt qua các lớp hoặc chức năng hoặc thậm chí các mô -đun ... def foo (): Truyền ở đây nó cung cấp địa chỉ cho Ex.Chức năng FOO AT0X024E4463 có nghĩa là nó được cung cấp địa chỉ của hàm foo nhưng trong lớp Itdoesnt có nghĩa là lớp foo: Pass ở đây nó đưa radef foo(): pass here it gives it address for ex. function foo at0x024E4463 means it is given address of foo function but in class itdoesnt means class foo: pass here it gives

Làm cách nào để chuyển thể hiện một đối tượng như một đối số trong một hàm?

Vượt qua một đối tượng như đối số..
Để truyền một đối tượng làm đối số, chúng tôi viết tên đối tượng làm đối số trong khi gọi hàm giống như cách chúng tôi thực hiện cho các biến khác.....
Ví dụ: Trong ví dụ này, có một lớp có biến số nguyên 'A' và hàm 'thêm' lấy một đối tượng làm đối số.....
Syntax:.

Bạn có thể chuyển bất kỳ loại đối tượng nào làm đối số cho một chức năng Python không?

Một hàm có thể lấy nhiều đối số, các đối số này có thể là đối tượng, biến (có cùng loại dữ liệu hoặc khác nhau) và các hàm.Các hàm Python là đối tượng hạng nhất.. Python functions are first class objects.