Необходимо различать («статические») переменные класса и («не статические») переменные экземпляра.
Вы объявляете все вещи статичными - это отлично подходит для вещей, которые делятся между всеми троллями (например, «тип» монстров - иначе говоря, тролль) - не так хорошо для вещей, которые все «имеют», но не являются «одинаковыми» - скажи как инвентарь.
Попробуйте этот подход:
import random
class Weapon: # no need to make each weapon its own class
def __init__(self,name,damage,effect):
self.name = name
self.damage = damage
self.effect = effect
# create some troll weapons to choose from
troll_weapons = [ Weapon("Wooden Stick", range(3), None), Weapon("Rocks",range(5), None) ]
class Equipment:
def __init__(self):
# every time you instantiate a new equipment, generate a random weapon
# for this instance you just created. They are not static, they differ
# between each Troll (who instantiates its own Equipment)
self.weapon = random.choice(troll_weapons)
class Troll:
name = 'Troll'
def __init__(self):
self.equipment = Equipment() # get a new instance of Eq for this troll
# instance
self.weapon = self.equipment.weapon # "link" the troll weapon to its equipment
# as shortcut - do smth similar to an
# instance of your "Stat" block
def __str__(self):
return f"Troll with: {self.weapon.name}"
# create a troll army
trolls = [Troll() for _ in range(10)]
for t in trolls:
print(t)
Выход:
Troll with: Rocks
Troll with: Wooden Stick
Troll with: Rocks
Troll with: Rocks
Troll with: Wooden Stick
Troll with: Rocks
Troll with: Wooden Stick
Troll with: Wooden Stick
Troll with: Wooden Stick
Troll with: Wooden Stick
Читает, чтобы проверить:
Классы
Переменные класса и переменные экземпляра
Sidenotes:
- существует соглашение о схемах именования, классы начинаются с заглавной буквы, члены в нижнем регистре