Я не программист C++, так что, может быть, я пропускаю некоторые детали метода указателей здесь, но это звучит, как вы просто хотите ссылку функция, определенная внутри класса. (Это были типа instancemethod
в Python 2, но просто введите function
в Python 3.)
Синтаксис будет немного отличаться --- вместо того, чтобы называть его как метод с object.reference(args)
, вы будете называть его, как функция: reference(object, args)
. object
будет аргументом для параметра self
--- в значительной степени то, что сделал бы компилятор для вас.
Несмотря на более синтаксис C-like, я думаю, что он по-прежнему делает то, что вы хотели ... по крайней мере, когда применяется к вызываемому члену, как в вашем примере. Это не будет помочь с необязательным полем экземпляра: они не существуют до тех пор, пока не пройдет __init__
.
Вот демонстрация:
#!/usr/bin/env python3
import math
class Vector(object):
def __init__(self, x, y):
self.x = x
self.y = y
return
def __str__(self):
return '(' + str(self.x) + ', ' + str(self.y) + ')'
def __repr__(self):
return self.__class__.__name__ + str(self)
def magnitude(self):
return math.sqrt(self.x ** 2 + self.y ** 2)
def print_dict_getter_demo():
print('Demo of member references on a Python dict:')
dict_getter = dict.get
d = {'a': 1, 'b': 2, 'c': 3, 'z': 26}
print('Dictionary d : ' + str(d))
print("d.get('a') : " + str(d.get('a')))
print("Ref to get 'a' : " + str(dict_getter(d, 'a')))
print("Ref to get 'BOGUS': " + str(dict_getter(d, 'BOGUS')))
print('Ref to get default: ' + str(dict_getter(d, 'BOGUS', 'not None')))
return
def print_vector_magnitude_demo():
print('Demo of member references on a user-defined Vector:')
vector_magnitude = Vector.magnitude
v = Vector(3, 4)
print('Vector v : ' + str(v))
print('v.magnitude() : ' + str(v.magnitude()))
print('Ref to magnitude: ' + str(vector_magnitude(v)))
return
def print_vector_sorting_demo():
print('Demo of sorting Vectors using a member reference:')
vector_magnitude = Vector.magnitude
v0 = Vector(0, 0)
v1 = Vector(1, 1)
v5 = Vector(-3, -4)
v20 = Vector(-12, 16)
vector_list = [v20, v0, v5, v1]
print('Unsorted: ' + str(vector_list))
sorted_vector_list = sorted(vector_list, key=vector_magnitude)
print('Sorted: ' + str(sorted_vector_list))
return
def main():
print_dict_getter_demo()
print()
print_vector_magnitude_demo()
print()
print_vector_sorting_demo()
return
if '__main__' == __name__:
main()
При запуске с Python 3, это дает:
Demo of member references on a Python dict:
Dictionary d : {'a': 1, 'c': 3, 'b': 2, 'z': 26}
d.get('a') : 1
Ref to get 'a' : 1
Ref to get 'BOGUS': None
Ref to get default: not None
Demo of member references on a user-defined Vector:
Vector v : (3, 4)
v.magnitude() : 5.0
Ref to magnitude: 5.0
Demo of sorting Vectors using a member reference:
Unsorted: [Vector(-12, 16), Vector(0, 0), Vector(-3, -4), Vector(1, 1)]
Sorted: [Vector(0, 0), Vector(1, 1), Vector(-3, -4), Vector(-12, 16)]
Как вы можете видеть, это работает как и встроенных команд классов, определенных пользователем.
Edit:
Огромный демо выше было основано на предположении: что вы имели ссылку на класс, и что ваша цель состояла в том, чтобы «держаться» к одному из методов класса для использования о том, какие экземпляры этого класса появились позже.
Если у вас уже есть ссылка на экземпляр, это гораздо проще:
d = {'a': 1, 'b': 2, 'c': 3, 'z': 26}
d_getter = d.get
d_getter('z') # returns 26
Это в основном то же самое, что и выше, только после преобразования из function
в method
была «заперта в «аргумент self
, поэтому вам не нужно его подавать.
@ Dan, вы можете предложить решение, которое позволило бы мне сделать это, вставив код C++ в мое приложение python :) –