#python #python-3.x
#python #python-3.x
Вопрос:
поэтому я ввожу:
router = router("a",graph)
в моей основной функции. Это возьмет график и поместит его в эту функцию маршрутизатора. Я хочу, чтобы моя функция поиска, я хочу, чтобы началом была буква «а», которую я назначил там выше и т.д., Но я попытался self.name и т.д., но это не работает. Как мне это исправить?
class router(object):
def __init__(self,name,Graph):
self.name = name
self.Graph = Graph
def find(self, start=name, maxD=1e309):
Комментарии:
1.
a
Она сохраняется какself.name
, и вы можете получить к ней доступ таким образом вfind
методе. Вы утверждаете, что пробовали это, было бы полезно увидеть эту попытку и посмотреть, сможем ли мы вам помочь
Ответ №1:
К сожалению, вы не можете инициализировать параметры на основе других параметров, поэтому вы можете инициализировать ее, чтобы None
затем проверить, является ли она None
:
class router(object):
def __init__(self,name,Graph):
self.name = name
self.Graph = Graph
def find(self, start=None, maxD=1e309):
if start is None:
start = self.name
# start is now initialized to self.name
pass
Комментарии:
1. привет, когда я делаю это, определяю кратчайший путь (график, начало = Нет, конец): «»»Найти кратчайший путь между начальными и конечными узлами на графике «»» # определить, проходит ли он с первого раза, установите текущее расстояние равным нулю, если значение start равно None: start = self.name передайте, что он возвращаетаргумент, отличающийся от аргумента по умолчанию, следует за аргументом по умолчанию
2. Если вы задаете
start
значение по умолчанию, вы также должны указатьend
значение по умолчанию, поскольку оно идет послеstart
в списке аргументов3. но я в своей функции find(«f») хочу передать f в end при наличии графика и начать уже там, мне все равно нужно присваивать значение по умолчанию? извините, я новичок в этом
4. Затем вы должны указать аргумент по умолчанию для graph и завершить первый аргумент и передать их в качестве аргументов ключевого слова.
5. Вам следует ознакомиться с аргументами по умолчанию и аргументами ключевого слова.
Ответ №2:
Вы можете использовать functools.partial
метод для предварительной инициализации _find
метода с искаженным именем и сохранить его в find
:
from functools import partial
class router(object):
def __init__(self, name, Graph):
self.name = name
self.Graph = Graph
self.find = partial(self._find, start=name)
def _find(self, start, maxD=1e309):
print(start, maxD)
rtr = router('router_name', 'some_graph')
rtr.find()
# Out: router_name inf
rtr.find(start='new_start', maxD=np.pi)
# Out: new_start 3.141592653589793
Поскольку это предполагает перезапись аргумента ключевого start
слова, имхо, лучше _find
всего заставить метод принимать только аргументы ключевого слова с синтаксисом *
-:
def _find(self, *, start, maxD=1e309):
print(start, maxD)
Дополнительную информацию см. В functools.partial
документации. Предложение
Если указаны дополнительные аргументы ключевого слова, они расширяют и переопределяют ключевые слова.
это важная часть, рассматривающая ваш вопрос.