Я хочу инициализировать функциональную переменную как ту, которая была введена ранее

#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 документации. Предложение

Если указаны дополнительные аргументы ключевого слова, они расширяют и переопределяют ключевые слова.

это важная часть, рассматривающая ваш вопрос.