web-dev-qa-db-ja.com

Python:Base DataClassから継承するDataClass、Baseから新しいクラスに値をアップグレードする方法

基本データマッチラスからそれを継承するものに値をアップグレードする方法を教えてください。

例(Python 3.7.2)

from dataclasses import dataclass

@dataclass
class Person:
    name: str 
    smell: str = "good"    

@dataclass
class Friend(Person):

    # ... more fields

    def say_hi(self):        
        print(f'Hi {self.name}')

friend = Friend(name='Alex')
f1.say_hi()
 _

「こんにちはアレックス」を印刷する

random_stranger = Person(name = 'Bob', smell='OK')
 _

random_strangerの復帰 "人(名前= 'bob'、香り= 'OK')"

Random_strangerを友達に変えるにはどうすればいいですか?

Friend(random_stranger)
 _

「友達」(name = person(name = 'bob'、香り= 'OK')、香り= '良い') "

その結果、「友達(name = 'bob」、shield =' OK ')」を入手したいのですが。

Friend(random_stranger.name, random_stranger.smell)
 _

働く、しかし、すべてのフィールドをコピーする必要がないのですか?

またはDataClassesから継承するクラスで@Dataclassデコレータを使用できないことは可能ですか?

8
576i

vars(stranger)は、DataClassインスタンスstrangerのすべての属性のDictを指定します。 DATACLassesのデフォルト__init__()メソッドはキーワード引数を取ります。twin_stranger = Person(**vars(stranger))は、値のコピーを持つ新しいインスタンスを作成します。 stranger_got_friend = Friend(**vars(stranger), city='Rome')のような追加の引数を指定した場合、派生クラスも機能します。

from dataclasses import dataclass


@dataclass
class Person:
    name: str
    smell: str


@dataclass
class Friend(Person):
    city: str

    def say_hi(self):
        print(f'Hi {self.name}')


friend = Friend(name='Alex', smell='good', city='Berlin')
friend.say_hi()  # Hi Alex
stranger = Person(name='Bob', smell='OK')
stranger_got_friend = Friend(**vars(stranger), city='Rome')
stranger_got_friend.say_hi()  # Hi Bob
 _
0
phispi