上記、タイトルのことを確認しています。
下記のサンプルコードを一つずつ挙動確認しながら理解できないことを書いていきました。なにかお気づきの点がありましたらご教示いただけませんでしょうか?
サンプルコード singleton.py
python
1class SpecialMethods: 2 print("class variable") 3 4 def __init__(self): 5 print(f"__init__: {self}") 6 7 def __new__(cls): 8 self = super().__new__(cls) 9 print(f"cls of __new__: {cls}") 10 print(f"self of __new__: {self}") 11 return self 12 13 def __call__(self): 14 print(f"__call__: {self}") 15 16 def _type(type): 17 print(f"type: {type}") 18 19 def _self(self): 20 print(f"self: {self}") 21 return type(self) 22 23 def _cls(cls): 24 print(f"cls: {cls}") 25 return type(cls)
コンソール
>>> from singleton import SpecialMethods class variable
1)なぜ、importした瞬間にprint文の出力がでるのでしょうか?
>>> sm = SpecialMethods >>> sm() cls of __new__: <class 'singleton.SpecialMethods'> self of __new__: <singleton.SpecialMethods object at 0x10d304f40> __init__: <singleton.SpecialMethods object at 0x10d304f40> <singleton.SpecialMethods object at 0x10d304f40> >>> type(sm) <class 'type'> >>>
2)通常であれば、sm = SpecialMethods()のように括弧付きで変数にいれることでクラスのインスタンス化ができるはずですが、かっこなしで変数にいれたあとにカッコつけることでインスタンス化することができるのでしょうか?
3)また、その場合、かっこなしでのsm及びSpecialMethodsは、なにものなんでしょうか?クラスオブジェクトといえばいいでしょうか?また、そのクラスオブジェクトの型が<class 'type'>になっていって、これは何を指しているのでしょうか?
>>> sm_fn = SpecialMethods() cls of __new__: <class 'singleton.SpecialMethods'> self of __new__: <singleton.SpecialMethods object at 0x10d304f40> __init__: <singleton.SpecialMethods object at 0x10d304f40> >>> sm_fn._type() type: <singleton.SpecialMethods object at 0x10d304f40> >>> sm_fn._self() self: <singleton.SpecialMethods object at 0x10d304f40> <class 'singleton.SpecialMethods'> >>> sm_fn._cls() cls: <singleton.SpecialMethods object at 0x10d304f40> <class 'singleton.SpecialMethods'>
4)<class 'singleton.SpecialMethods'>は、type()でかえってきた型のはずですが、型名でもなくただのクラス名を返しています。これは何を意味しているのでしょうか?
上記と同じコードを下記のようにpythonコマンドを実行した場合
python
1... 2... 3... 4if __name__ == '__main__': 5 6 ss = SpecialMethods() 7 print(ss()) 8 print(ss) 9 print(ss._type()) 10 print(ss._self()) 11 print(ss._cls()) 12
$ python singleton.py class variable cls of __new__: <class '__main__.SpecialMethods'> self of __new__: <__main__.SpecialMethods object at 0x108bf8f70> __init__: <__main__.SpecialMethods object at 0x108bf8f70> __call__: <__main__.SpecialMethods object at 0x108bf8f70> None <__main__.SpecialMethods object at 0x108bf8f70> type: <__main__.SpecialMethods object at 0x108bf8f70> None self: <__main__.SpecialMethods object at 0x108bf8f70> <class '__main__.SpecialMethods'> cls: <__main__.SpecialMethods object at 0x108bf8f70> <class '__main__.SpecialMethods'>
5)インスタンス化した場合は、typeの結果が__main__.となりますが、<class 'main.SpecialMethods'>の部分の、main.は何を指していてい、なぜでてくるのでしょうか?
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/04/21 04:04
2021/04/21 07:57
2021/04/21 17:52