

タイトルについて質問です。  
例えば以下の情報をprint文で出力するとします。

[code]

    犬は朝起きる
    犬は昼ごはん食べる
    犬は夜ご飯食べる
    犬は寝る
    
    猫は朝起きる
    猫は昼ごはん食べる
    猫は夜ご飯食べる
    猫は寝る
    
[/code]

犬というクラスと、猫というクラスがあります。  
「朝起きる」「昼ごはんたべる」等というメソッドがあり、その中でprint文を出力します。

犬と猫ともに、ふるまいは全く同じですが、出力するものが違います。これについて、何か効率的な処理はあるでしょうか？  
言語は、Pythonで考えていただければ大変助かります。

お手数ですがよろしくお願いします。


CC BY-SA 4.0
2023-11-16T12:01:32.037
96802
2023-11-17T09:10:41.280
2023-11-17T09:10:41.280
3060
43586
question
python プログラミング言語
プログラミング　同じ処理


既に  
オブジェクト指向  
継承  
などの用語が出ているので、それで解決していると思いますが。

[code]

    class Animal:
        def __init__(self, name):
            self.name = name
        def wakeup(self):
            print(f"{self.name} wakeup.")
    
    class Dog(Animal):
        def __init__(self):
            super().__init__("dog")
        
    my_dog = Dog()
    my_dog.wakeup()
    del my_dog
    
[/code]


CC BY-SA 4.0
2023-11-17T00:49:43.797
96804
2023-11-17T00:49:43.797
60424
96802
answer


効率的かどうかは分かりませんが、`dataclass` を使うのもよいかと思います。

[code]

    from abc import ABCMeta, abstractmethod
    from dataclasses import dataclass
    
    @dataclass
    class OneDay(metaclass=ABCMeta):
        @abstractmethod # forbid instantiate
        def __init__(self): pass
    
        @classmethod
        def do_action(cls, action='何もしない'):
            if cls != __class__:
                print(f'{cls.__name__}は{action}')
    
    methods = ['朝起きる', '昼ごはん食べる', '夜ご飯食べる', '寝る']
    for m in methods:
        setattr(OneDay, m, classmethod(lambda cls,m=m: cls.do_action(action=m)))
    del methods
    
    @dataclass
    class 犬(OneDay): pass
    
    @dataclass
    class 猫(OneDay): pass
    
    if __name__ == '__main__':
        犬.朝起きる()
        犬.昼ごはん食べる()
        犬.夜ご飯食べる()
        犬.寝る()
        犬.do_action(action='駆け回る')
    
        猫.朝起きる()
        猫.昼ごはん食べる()
        猫.夜ご飯食べる()
        猫.寝る()
        猫.do_action(action='炬燵で丸くなる')
    
[/code]


CC BY-SA 4.0
2023-11-17T04:31:11.420
96807
2023-11-17T05:51:29.403
2023-11-17T05:51:29.403
47127
47127
96802
answer