objectを単純に継承しただけなのに、なぜ挙動が異なるのでしょうか?
とりあえず、リファレンスを見てみます。
class object
特徴を持たない新しいオブジェクトを返します。 object は全てのクラスの基底クラスです。これは、 Python のクラスの全てのインスタンスに共通のメソッド群を持ちます。この関数はいかなる引数も受け付けません。
注釈 object は __dict__
を 持たない ので、 object クラスのインスタンスに任意の属性を代入することはできません。
組み込み関数 — Python 3.8.2 ドキュメント
そういうものらしいです。object
自身は任意の属性を持つことができません。object
を継承したクラスで初めてそういう機能が生じます。
組み込み型はけっこうこういう側面が強いので、そんなに深く理解しようと考えない方が良いでしょう。
定義されていない属性に値を設定しようとすると、has no attributeを発生させたい。
__setattr__
で拾うとかでしょうか。
3. データモデル — Python 3.8.2 ドキュメント
python
1class MyClass:
2 attrs = {"a", "b"}
3
4 def __setattr__(self, name, value):
5 if name in type(self).attrs:
6 super().__setattr__(name, value)
7 else:
8 raise AttributeError("'%s' object has no attribute '%s'" %
9 (type(self).__name__, name))
10
11obj = MyClass()
12obj.a = 1
13print(obj.a)
14obj.b = 2
15print(obj.b)
16obj.c = 3
17print(obj.c) # ここで例外になって止まる
18
これは完璧ではなく、__dict__
属性を直接書き換えてしまえば回避できます。そこまで想定しないなら使えます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/06 15:02
2020/04/06 15:05
2020/04/07 14:57