Atcoder Typical DP Contest S - マス目(狀壓 dp+剪枝)
阿新 • • 發佈:2021-07-08
在python中基於類可以建立物件
# 定義類 class Foo(object): def __init__(self.name): self.name = name def __new__(cls,*args,**kwargs): data = object.__new__(cls) return data # 根據類建立物件,分兩步 # 1. 在內部執行new方法,建立一個空物件 {} # 2. 之後執行類的init方法,初始化物件。{"name":"xiao"} # 注意“:new方法稱為構造方法,init方法稱為初始化方法 obj = Foo("xiao")
對像-----------基於類實現的
類 ------------基於啥實現的????
類 預設是有type建立的 def do(self): pass # 1.建立類 # 類名。 繼承誰 成員 Fun = type("Foo", (object,), {"v1": 123, "func": lambda self: 666, "do": do}) # 2.根據類建立物件 obj = Fun() # 3.呼叫物件中v1變數(類變數) print(obj.v1) # 4.執行物件的func方法 result = obj.func() print(result)
元類
# 肯定由type建立 class Foo(object): pass # 指定建立類的方法 # 首先先建立一個類,這個類繼承type # metaclass指定類 class Myclass(type): pass class Fun(object,metaclass=Myclass): pass # Fun類由Myclass建立
例子
class Myclass(type): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def __new__(cls, *args, **kwargs): new_class = super().__new__(cls, *args, **kwargs) return new_class def __call__(self, *args, **kwargs): # 1. 呼叫自己那個類的 __new__ 方法去建立物件 empty_object = self.__new__(self) # 2. 呼叫自己那個類的 __init__ 方法初始化 self.__init__(empty_object, *args, **kwargs) return empty_object class Fun(object, metaclass=Myclass): def __init__(self, name): self.name = name # 執行的過程也是先走new在走init v1 = Fun("xiaoqiang") print(v1.name) """ 類加()是執行 __new__ 和 __init__ 物件加 ()[現在這段程式碼是Fun(),程式碼至上而下,走到class Fun處,建立Fun類,在往下遇見Fun()走Myclass的__call__的方法(也就是說Fun類是Mycls)] 是走的__call__ 的方法 在走__call__的方法時 先走的是__new__,在走__init__ """