Miras Alınan Sınıfın Niteliği Nasıl Değiştirilmelidir?

Merhabalar. Python’da sınıflarla ilgili alıştırma yapıyorken, miras aldığım sınıfın bir niteliğini değiştirme konusunda 2 seçenek arasında kaldım. Takıldığım kısım şu şekilde:

class Warrior(Character):
    "Warrior Class provides extra 10 health."
    def __init__(self, *args):
        super().__init__(*args)
        self.health += 10

class Magister(Character):
    "Warrior Class provides extra 10 damage."
    def __init__(self, *args):
        super().__init__(*args)
        setattr(self, "damage", self.damage + 10)

Warrior sınıfında super() ile miras aldığım niteliklerden "health"i bir operatör ile değiştiriyorum.
Magister sınıfında ise bunu setattr ile yapıyorum. Bunlardan hangisi işin doğru biçimde yapılışıdır? İkisi de değilse, doğrusu nedir? Teşekkür ederim.

Kodun Tamamı
#!/usr/bin/bash

class Character(object):
    races = {"Human":
            {"Health": 100, 
            "Damage": 25}, 
    "Elven":
        {"Health": 75, 
        "Damage": 35}, 
    "Dwarf": 
    {"Health": 125, 
    "Damage": 15}}
    armors = ["Silver", "Leather", "Daedric"]

    def __init__(self):
        """ Sets name, race and armor. """
        self.name = input("Please enter character name: ").title()
        self.select_race()
        self.select_armor()
    
    def select_race(self):
        """ Changes damage and health attributes."""
        while True:
            print("Please select a race: [Human, Elven, Dwarf]")
            race = input(">>> ").capitalize()
            if race not in Character.races:
                print(f"No race such as '{race}'!\n Please try again.")
                continue
            else:
                print(f"Race '{race}' set.")
                self.race = race
                self.damage = self.races[race]['Damage']
                self.health = self.races[race]['Health']
                break
        
    def select_armor(self):
        """ Ineffective. """
        print("Please select an armor: [Silver, Leather, Daedric]")
        armor = input(">>> ").capitalize()
        while True:
            if armor not in Character.armors:
                print(f"No race such as '{armor}!\nPlease try again.'")
                continue
            else:
                print(f"Armor '{armor}' set.")
                self.armor = armor
                break
    
    def display_character(self):
        print(f"""Character Name  : {self.name}
Character Race  : {self.race}
Character Damage: {self.damage}
Character Health: {self.health}
Character Armor : {self.armor}""")

class Warrior(Character):
    "Warrior Class provides extra 10 health."
    def __init__(self, *args):
        super().__init__(*args)
        self.health += 10

class Magister(Character):
    "Warrior Class provides extra 10 damage."
    def __init__(self, *args):
        super().__init__(*args)
        setattr(self, "damage", self.damage + 10)


user = Magister()
user.display_character()
    

1 Beğeni

Merhaba, setattr(obj, attr, value)'nun yaptığıyla obj.attr = value aynı yere tekabül ediyor; fakat yalnız setattr fonksiyonu, attr değerinin dinamik olarak elde edildiği durumlarda kullanılabiliyor. Mesela attr bir değişken içerisindeyse. Sizdeki durumda dolayısıyla setattr'a gerek yok diyebiliyoruz çünkü hangi niteliğin değişmek üzere olduğunu programı yazarken biliyorsunuz.


obj = type("A", (), {})()

# burada bildiğiniz `.attr` isimli bir nitelik 2 defa `obj` objesine eklenir
# (ilk dönüşte eklenir, diğer(ler)inde üstüne yazılır). değeri de son
# dönüşteki `-2` olur.
for attr, value in zip(["bir", "iki"], [-1, -2]):
    obj.attr = value

print([nit for nit in dir(obj) if not nit.startswith("__")])
obj = type("A", (), {})()

# burada dinamik olarak nitelik eklemesi yapabiliyoruz.
# hem `.bir` hem de `.iki` nitelikleri eklenir; değerleri sırasıyla -1 ve -2.
for attr, value in zip(["bir", "iki"], [-1, -2]):
    setattr(obj, attr, value)

print([nit for nit in dir(obj) if not nit.startswith("__")])
1 Beğeni

Şimdi anladım, teşekkür ederim.

1 Beğeni