Мне было интересно, как создать хороший класс, чтобы создать график matplotlib, подходящий для моей цели. Первое, что я хочу получить, - это класс, который можно назвать следующим,
но я понятия не имею, как создать такой класс.
Вот как я хочу его использовать:
fig,axs = MyClass(parameter...)
Как я могу правильно использовать это?
EDIT Большое спасибо @ImportanceOfBeingErnest, вы даете мне очень хорошую стартовую точку, теперь мой вопрос заключается в том, что вы показываете мне, как передать параметр ** классу, что вы думаете о том, как передать список переменных, чтобы быть построены в ax1,ax2,ax3,ax4
например? Еще раз спасибо, ваша помощь всегда очень ценна
По существу, вы не можете или, по крайней мере, не должны. Возвращение класса должно быть экземпляром самого себя.
Однако вы можете назвать класс, например
import matplotlib.pyplot as plt
class MyClass():
def __init__(self, **parameters):
self.fig, self.axs = plt.subplots(**parameters)
def __call__(self):
return self.fig, self.axs
fig, axs = MyClass(figsize=(6,5))()
Недостатком этого является то, что вы напрямую теряете любой обработчик для созданного экземпляра класса. Это означает, что вышеупомянутое было бы намного проще записывать как функцию,
import matplotlib.pyplot as plt
def myfunction(**parameters):
fig, axs = plt.subplots(**parameters)
return fig, axs
fig, axs = myfunction(figsize=(6,5))
Поэтому для того, чтобы использование класса имело какой-либо смысл, вероятно, захочется его каким-то образом сохранить, а затем использовать его атрибуты или методы.
import matplotlib.pyplot as plt
class MyClass():
def __init__(self, **parameters):
self.fig, self.axs = plt.subplots(**parameters)
myclass = MyClass(figsize=(6,5))
fig = myclass.fig
axs = myclass.axs
Добавляя к другому ответу, вы также можете создать класс, который реализует функцию __iter__
которая эмулирует класс как кортеж, позволяя ему возвращать fig, axs
:
class MyClass:
def __init__(self, params):
self.fig, self.axs = plt.subplots()
# Do stuff here
def __iter__(self):
for e in (self.fig, self.axs):
yield e
fig, axs = MyClass(params)
Однако это довольно неортодоксально, как описано @ImportanceOfBeingErnest.