1. 程式人生 > 其它 >11. 盛最多水的容器(LeetCode)

11. 盛最多水的容器(LeetCode)

在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__
"""