Câu trả lời:
Đúng vậy, chỉ cần sử dụng tên của phương thức, như bạn đã viết. Các phương thức / hàm là các đối tượng trong Python, giống như mọi thứ khác và bạn có thể chuyển chúng xung quanh cách bạn thực hiện các biến. Trong thực tế, bạn có thể nghĩ về một phương thức (hoặc hàm) như một biến có giá trị là đối tượng mã có thể gọi thực tế.
FYI, không có call
phương pháp nào - tôi nghĩ nó được gọi __call__
, nhưng bạn không cần phải gọi nó một cách rõ ràng:
def method1():
return 'hello world'
def method2(methodToRun):
result = methodToRun()
return result
method2(method1)
Nếu bạn muốn method1
được gọi bằng các đối số, thì mọi thứ sẽ phức tạp hơn một chút. method2
phải được viết với một chút thông tin về cách truyền đối số method1
và nó cần lấy giá trị cho các đối số đó từ đâu đó. Chẳng hạn, nếu method1
được cho là lấy một đối số:
def method1(spam):
return 'hello ' + str(spam)
sau đó bạn có thể viết method2
để gọi nó với một đối số được truyền vào:
def method2(methodToRun, spam_value):
return methodToRun(spam_value)
hoặc với một đối số mà nó tự tính toán:
def method2(methodToRun):
spam_value = compute_some_value()
return methodToRun(spam_value)
Bạn có thể mở rộng giá trị này sang các kết hợp giá trị khác được truyền vào và các giá trị được tính toán, như
def method1(spam, ham):
return 'hello ' + str(spam) + ' and ' + str(ham)
def method2(methodToRun, ham_value):
spam_value = compute_some_value()
return methodToRun(spam_value, ham_value)
hoặc thậm chí với các đối số từ khóa
def method2(methodToRun, ham_value):
spam_value = compute_some_value()
return methodToRun(spam_value, ham=ham_value)
Nếu bạn không biết, khi viết method2
, những đối số methodToRun
nào sẽ diễn ra, bạn cũng có thể sử dụng giải nén đối số để gọi nó theo cách chung:
def method1(spam, ham):
return 'hello ' + str(spam) + ' and ' + str(ham)
def method2(methodToRun, positional_arguments, keyword_arguments):
return methodToRun(*positional_arguments, **keyword_arguments)
method2(method1, ['spam'], {'ham': 'ham'})
Trong trường hợp này positional_arguments
cần phải là một danh sách hoặc tuple hoặc tương tự, và keyword_arguments
là một dict hoặc tương tự. Trong method2
bạn có thể sửa đổi positional_arguments
và keyword_arguments
(ví dụ để thêm hoặc xóa một số đối số nhất định hoặc thay đổi các giá trị) trước khi bạn gọi method1
.
Vâng, nó là có thể. Chỉ cần gọi nó:
class Foo(object):
def method1(self):
pass
def method2(self, method):
return method()
foo = Foo()
foo.method2(foo.method1)
def method1(): pass def method2(method) return method() method2(method1)
Dưới đây là ví dụ của bạn được viết lại để hiển thị một ví dụ hoạt động độc lập:
class Test:
def method1(self):
return 'hello world'
def method2(self, methodToRun):
result = methodToRun()
return result
def method3(self):
return self.method2(self.method1)
test = Test()
print test.method3()
Đúng; hàm (và phương thức) là các đối tượng lớp đầu tiên trong Python. Các công việc sau đây:
def foo(f):
print "Running parameter f()."
f()
def bar():
print "In bar()."
foo(bar)
Đầu ra:
Running parameter f().
In bar().
Các loại câu hỏi này không quan trọng để trả lời bằng trình thông dịch Python hoặc, để biết thêm các tính năng, trình bao IPython .
Nếu bạn muốn truyền một phương thức của một lớp làm đối số nhưng chưa có đối tượng mà bạn sẽ gọi nó, bạn có thể chỉ cần truyền đối tượng một khi bạn có nó làm đối số đầu tiên (tức là "tự" tranh luận).
class FooBar:
def __init__(self, prefix):
self.prefix = prefix
def foo(self, name):
print "%s %s" % (self.prefix, name)
def bar(some_method):
foobar = FooBar("Hello")
some_method(foobar, "World")
bar(FooBar.foo)
Điều này sẽ in "Hello World"
Rất nhiều câu trả lời hay nhưng lạ mà không ai nhắc đến khi sử dụng lambda
hàm.
Vì vậy, nếu bạn không có tranh luận, mọi thứ trở nên tầm thường:
def method1():
return 'hello world'
def method2(methodToRun):
result = methodToRun()
return result
method2(method1)
Nhưng giả sử bạn có một (hoặc nhiều) đối số trong method1
:
def method1(param):
return 'hello ' + str(param)
def method2(methodToRun):
result = methodToRun()
return result
Sau đó, bạn có thể chỉ cần gọi method2
như method2(lambda: method1('world'))
.
method2(lambda: method1('world'))
>>> hello world
method2(lambda: method1('reader'))
>>> hello reader
Tôi thấy điều này sạch sẽ hơn nhiều so với các câu trả lời khác được đề cập ở đây.
()
ở cuối đối tượng trong cuộc gọi trở lại của mình, duh.
Phương thức là đối tượng như bất kỳ khác. Vì vậy, bạn có thể vượt qua chúng, lưu trữ chúng trong danh sách và ký hiệu, làm bất cứ điều gì bạn thích với chúng. Điều đặc biệt về chúng là chúng là những vật thể có thể gọi được để bạn có thể gọi __call__
chúng. __call__
được gọi tự động khi bạn gọi phương thức có hoặc không có đối số để bạn chỉ cần viết methodToRun()
.
Không chính xác những gì bạn muốn, nhưng một công cụ hữu ích có liên quan là getattr()
, sử dụng tên của phương thức làm tham số.
class MyClass:
def __init__(self):
pass
def MyMethod(self):
print("Method ran")
# Create an object
object = MyClass()
# Get all the methods of a class
method_list = [func for func in dir(MyClass) if callable(getattr(MyClass, func))]
# You can use any of the methods in method_list
# "MyMethod" is the one we want to use right now
# This is the same as running "object.MyMethod()"
getattr(object,'MyMethod')()
foo
thì sao?