Вызовите атрибут класса экземпляра класса из функции в python - PullRequest
0 голосов
/ 14 февраля 2020

Допустим, я хочу построить другой атрибут объектов класса из функции.

Пока у меня есть это:

...

import matplotlib.pyplot as plt

def plot2vars (deviceList, xVars, yVars, xLims, yLims, colormap=plt.cm.Spectral):
    x0 = xVars[0]
    x1 = xVars[1]
    y0 = yVars[0]
    y1 = yVars[1]
    fig, ax = plt.subplots(1,2)

    fig, ax = plt.subplots(1,2)
    for d in deviceList: #these 'd' are the class instances...
        if not d.discard:
                    ax[0].plot(d.x0, d.y0)
                    ax[0].set_xlim(xLims[0])
                    ax[0].set_ylim(yLims[0])

                    ax[1].plot(d.x1, d.y1)
                    ax[1].set_xlim(xLims[1])
                    ax[1].set_ylim(yLims[1])
    plt.show()

, где deviceList - это список, содержащий экземпляры класса с различными атрибутами, такими как Например, u, z или T.

Теперь, когда я вызываю функцию, я объявляю xVars, yVars, xLims, yLims как массивы строк, что, очевидно, не работает , Но я не знаю, как это назвать. И я даже не знаю, как это искать в руководствах ...

plot2vars (
      deviceList, 
      xVars=['u', 'u'], yVars=['z', 'T'],  
      xLims=['', 'left=0.8'], yLims=['','bottom=0, top=0.8']
      )

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Так что, если я правильно понимаю, вы пытаетесь получить доступ к атрибуту u объекта d, который обычно вызывается записью d.u, но вы хотите иметь возможность сделать это, не определяя заранее, что рассматриваемый атрибут u.

d.x0 будет искать атрибут d, который называется x0, который не имеет ничего общего с x0, который вы определили.

Наиболее близким к тому, что вы пытаетесь сделать в этом случае, является функция getattr: getattr(d, x0) должна давать вам то, что вы хотите.

При этом, если вы можно избежать его использования. Я бы порекомендовал просто передать d.u в качестве аргумента plot2vars и соответственно отредактировать plot2vars.

1 голос
/ 14 февраля 2020

Возможно, если вы хотите взять атрибуты, заданные в виде строк, из ваших xVars и yVars, вы должны использовать метод getattr, например:

d.x0 -> getattr(d, x0)

Например, если x0 = 'qwerty', getattr(d, x0) равно d.qwerty.

Итак, в вашем коде вы должны использовать:

...
ax[0].plot(getattr(d, x0), getattr(d, y0))
...
ax[1].plot(getattr(d, x1), getattr(d, y1))
...

Документация: https://docs.python.org/3/library/functions.html#getattr


Что касается xLims и yLims, я бы определил его как список словарей, подобный этому:

xLims = [{}, {'left': 0.8}]
yLims = [{}, {'bottom': 0, 'top': 0.8}]

Так что это позволило бы мне использовать их с помощью **kwargs подхода:

...
ax[0].set_xlim(**xLims[0])
ax[0].set_ylim(**yLims[0])
...
ax[1].set_xlim(**xLims[1])
ax[1].set_ylim(**yLims[1])
...

Основная идея заключается в том, что когда вы передаете словарь функции с **, пары ключ-значение будут распакованы в аргументы ключ-значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...