У меня есть код, который в целом похож на следующий:
class ABC(Parent):
def func1(self, **kwargs)
start_time = time.time()
...
...
return stuff
class XYZ(Parent):
def func2(self, **kwargs)
...
...
a = time.time() - start_time
return other_stuff
Я ищу самый простой способ использования переменной start_time
, определенной в func1
класса ABC внутри func2
в классе XYZ.
Примечание. Этот код очень общий, а реальный код, с которым я работаю, намного, намного сложнее. В других ответах, которые я нашел, упоминалось определение start_time
вне любого класса с последующей их передачей, ИЛИ они включают изменение аргументов. Я не могу сделать это. Мой start_time
должен быть определен именно здесь и больше нигде, и я не могу изменить свои аргументы ни в пользу func1
, ни в пользу func2
.
Спасибо за любую помощь.
Вы должны передать экземпляр ABC
экземпляру XYZ
.
@ Дэниел, какой у этого синтаксис? Я новичок в Python.
Если вы ничего не можете изменить, значит, вы не можете решить свою проблему. У Другие ответы, кажется, есть очень хорошие предложения. Переменная объявляется внутри функции, если она не нужна снаружи. В противном случае это место где-то еще.
Вы можете сделать start_time
атрибутом класса в Parent
.
class Parent(object):
def __init__(self):
self.start_time = None
class ABC(Parent):
def func1(self, **kwargs)
self.start_time = time.time()
...
...
return stuff
class XYZ(Parent):
def func2(self, **kwargs)
...
...
a = time.time() - self.start_time
return other_stuff
start_time
- это независимая переменная каждого экземпляра.
Трудно решить вашу проблему методом, который не будет беспорядочным. По сути, вам нужно будет использовать переменную вне обеих ваших функций. Я думаю, что ваш лучший вариант - использовать ключевое слово python global
:
class ABC(Parent):
def func1(self, **kwargs):
global start_time
start_time = time.time()
return stuff
class XYZ(Parent):
def func2(self, **kwargs):
global start_time
a = time.time() - start_time
return other_stuff
Использование global
здесь позволяет вам избежать определения вашей переменной вне вашей функции.
Лучше всего избегать загрязнения глобального пространства имен global
, когда вы можете просто передать экземпляры классов и получить доступ к start_time
через ABC.start_time
.
Я согласен, но в исходном вопросе говорилось, что аргументов быть не могло.
Но аргументы передавать не нужно? Атрибуты экземпляра подойдут.
Если вы хотите использовать экземпляры каждого класса независимо, вам нужно будет передать аргументы. По их утверждению: «Мое start_time должно быть определено именно здесь и нигде больше, и я не могу изменить свои аргументы ни для func1, ни для func2». Похоже, это то, что они ищут
Вы бы сказали, что я привожу аргументы в своем ответе? (ни один из методов не принимает никаких аргументов, кроме self
)
Нет, но вы предполагаете, что класс XYZ
зависит от ABC
, а ABC
не зависит от XYZ
. Исходя из исходного вопроса, невозможно сказать, возможно ли это в его коде.
OP хочет "(...) использовать переменную start_time, определенную в func1 класса ABC внутри func2 в классе XYZ" Я понимаю это как «одностороннюю» зависимость. Если вам нужно передавать значения в обоих направлениях, возможно, имеет смысл создать третий класс, который вместо этого создает экземпляры как ABC
, так и XYZ
.
Есть несколько способов сделать это. Вот тот, который избегает global
, делая start_time
переменной / атрибутом экземпляра ABC
и создавая экземпляр ABC
в XYZ
. Я думаю, что это тоже то, на что намекал пользователь @Daniel в комментарии «Вы должны передать экземпляр ABC экземпляру XYZ».
import time
class Parent:
pass
class ABC(Parent):
def __init__(self):
self.start_time = None
def func1(self):
self.start_time = time.time()
class XYZ(Parent):
def __init__(self):
self.abc = ABC()
def func2(self):
self.abc.func1()
return time.time() - self.abc.start_time
xyz = XYZ()
print(xyz.func2())
Вывод Python3.5:
>>> xyz = XYZ()
>>> print(xyz.func2())
9.5367431640625e-07
ваши аргументы -
**kwargs
, вы можете передать что угодно.