あんまりググってないし、ドキュメント等を確認できているわけではないのですごくラフな投稿。よく考えればできても不思議ではないと思ったのですが、初見時意外に思ったので、思い付きでポストしてます(要は備忘録)。。突っ込みどころ満載かもしれません(突っ込んでください1。特に用語が曖昧です。この記事では属性とプロパティを混同してます。)
まず前提として
「オブジェクトにプロパティ」と聞くとclassを定義して云々するのが普通の感覚だと思います。
python3
class Hoge(object):
def __init__(self, name):
self.attr = f"{name}'s attr"
if __name__=="__main__":
h = Hoge("namnium")
print(h.attr) # => namnium's attr
が、なんか関数自体にも属性値をつけられるというね。。JavaScriptみたい2
python3
def f():
return 0
f.attr = "f's attr"
print(f.attr) # => f's attr
python3
a = lambda : "hoge"
a.b = "fuga"
print("a: ", a()) # => hoge
print("a.b: ", a.b) # => fuga
Djangoのチュートリアル中に出てきたメソッドにこの方法での属性値設定が行われていたので、少し実験してみましたという感じです。。
できないのはわかっていましたが、文字列やリストでもやってみましたけどやっぱり無理でした。。リストでもできないということは mutable
かどうかとかが関係してるわけでもなさそう...
なにか属性を付けられるオブジェクトに法則性がありそうですが、それについてはこれからドキュメント等を調べようと思います。
Djangoのようにフレームワークで使うならわかりますが機能としては普段は使わなさそう...何かわかり次第追記します。