Автоматическая инициализация нескольких экземпляров класса - PullRequest
0 голосов
/ 10 января 2020

До сих пор я в основном использовал Python для анализа данных, но какое-то время пытался реализовать что-то. Прямо сейчас я пытаюсь реализовать модель токсикокинети c -токсикодинамики c для sh, чтобы проанализировать влияние химических веществ на них.

Итак, учитывая следующий код:

import numpy as np

class fish():

def __init__(self):
    self.resistance_threshold = np.random.normal(0,1)


Теперь мой вопрос, скажем, я хотел бы инициализировать несколько экземпляров класса рыбы (скажем, 1000 sh), каждый с разной устойчивостью к химическому веществу, чтобы смоделировать популяцию на основе агентов. Как можно достичь этого автоматически?

Мне было интересно, есть ли что-то, например, использование индекса в качестве части имени переменной, например:

for fishid in range(0,1000):
    fishfishid = fish() # use here the value of fishid to become the variables name. E.g. fish1, fish2, fish3, ..., fish999

Теперь, даже если есть возможность сделать это в Python, у меня всегда есть ощущение, что реализация этих 1000 экземпляров - плохая практика. И мне было интересно, есть ли подход OOP - Python. Например, установка класса «популяция», которая инициализирует его в своей собственной функции __init__, но как бы я назначил fi sh без предварительной инициализации?

Любые подсказки, указатели или ссылки будут с благодарностью.

1 Ответ

1 голос
/ 10 января 2020

Вы можете создать класс FishPopulation и затем сохранить все необходимые Fish на основе аргумента размера. Например, что-то вроде этого будет работать:

import numpy as np


class Fish:
    def __init__(self):
        self.resistance_threshold = np.random.normal(0, 1)


class FishPopulation:
    def __init__(self, size=1000):
        self.size = size
        self.fishes = [Fish() for _ in range(size)]

Вы можете повторить это так:

fish_population = FishPopulation(size=10)
for fish in fish_population.fishes:
    print(fish.resistance_threshold)

>>> 
    -0.9658927669391391
    -0.5934917229482478
    0.8827336199040103
    -1.5729644992077412
    -0.7682070400307331
    1.464407499255235
    0.7724449293785645
    -0.7296586180041732
    -1.1989783570280217
    0.15716170041128566

И вы можете получить доступ к их индексам, например:

print(fish_population.fishes[0].resistance_threshold)

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