物件導向程式設計 類 class 2

2022-03-17 02:44:41 字數 3502 閱讀 6348

公共成員:可以在類的外部訪問到。我們之前接觸到的都是公共成員

私有成員:只能在該類的內部才能直接訪問到的(子類也不能直接訪問);在外部,可以通過間接方法才能取得。 以欄位(普通欄位和靜態字段相同)為例,開頭加__(雙下劃線)使欄位變為私有字段;方法也一樣,方法名前面加__(雙下劃線)即可。

class db:

def __init__(self,ip,username,passwd):

self.__ip = ip

self.__username = username

self.__passwd = passwd

def show(self):

return self.__ip

obj = db('1.1.1.1','root','123456')

print(obj.__ip) # 會報異常

ip = obj.show()

print(ip) # 通過show方法才能拿到

1、 構造方法 __init__方法

類() 自動執行
2、 類似構造方法,這裡是乙個特殊的呼叫方法 __call__方法

物件() 或者 類()() 自動執行
class foo:

def __init__(self):

print("in init")

def __call__(self,*args,**kwargs):

print("in call")

obj = foo() # 建立物件 obj

obj() # 物件後面加括號,呼叫,則執行類中的__call__方法

3、 特殊方法 __int__方法

class foo:

def __init__(self):

pass

def __int__(self):

return 123

obj = foo()

print(obj,type(obj))

print(int(obj)) # 將obj物件強制轉換為int型別。返回123

在上面例子中,我們執行 int(物件),則自動執行 物件的\_\_int__方法,並將返回值賦值給 int(物件); 實際字串強轉整型時,就是這樣。我們定義字串時,其實是呼叫的str類,將我們定義的字串的值傳給了該類中。s = 'bashrunning' 就是 s = str('bashrunning'),可以看出,s就是乙個物件。
同理,還有 __str__方法、列表的(__getitem__、__setitem__、__delitem__)方法。

我們用的比較多的是__str__方法。 使用案例:

class ourssh:

def __init__(self,ip,username,passwd):

self.ip = ip

self.username = username

self.passwd = passwd

def __str__(self):

return 'ip=%s\nusername=%s\npasswd=%s' %(self.ip,self.username,self.passwd)

obj = ourssh('1.1.1.1','root','123456')

print(obj) # 執行print時,實際上是執行的 str(obj)。如果ourssh類 中沒有定義 __str__方法,則列印 <__main__.ourssh object at>。定義了 __str__方法後,則列印 __str__方法返回的值

print操作,其實是兩個步驟:print(abc) == print(str(abc))

步驟一: str(abc) ,呼叫 abc的__str__方法,得到返回值。 步驟二: print列印這個返回值。

class foo:

def __init__(self,name,age):

self.name = name

self.age = age

self.id = none

obj = foo("bash",22)

print(obj.__dict__) # 返回乙個字典 這是這個物件的所有成員。如果成員是私有成員,則該成員的key為 _類名+該私有成員名

print(foo.__dict__) # 返回乙個字典,這個類的所有成員。 如果成員是私有成員,則該成員的key為 _類名+該私有成員名

5、 for迴圈拆解

for迴圈遇到的物件是乙個迭代器,則直接執行該物件的__next__方法。

for迴圈遇到的物件是乙個可迭代物件,則先執行__iter__方法來獲取迭代器,然後再執行__next__方法。

在python中,一切事物皆是物件。

__new__

建立類就可以有兩種方式:

類預設是由 type 類例項化產生,type類中如何實現的建立類?類又是如何建立物件?

答:類中有乙個屬性 __metaclass__,其用來表示該類由 誰 來例項化建立,所以,我們可以為 __metaclass__ 設定乙個type類的派生類,從而檢視 類 建立的過程。

class mytype(type):

def __init__(self, what, bases=none, dict=none):

super(mytype, self).__init__(what, bases, dict)

def __call__(self, *args, **kwargs):

obj = self.__new__(self, *args, **kwargs)

self.__init__(obj)

class foo(object):

__metaclass__ = mytype

def __init__(self, name):

self.name = name

def __new__(cls, *args, **kwargs):

return object.__new__(cls, *args, **kwargs)

# 第一階段:直譯器從上到下執行**建立foo類

# 第二階段:通過foo類建立obj物件

obj = foo()

以上感謝武老師的部落格。

物件導向程式設計(class) 2

繼承是物件的特性之一 子類會覆蓋父類的相同方法,如何使用父類相同的方法 classp def init self,name self.name name class c p def init self,name,age self.age age 呼叫父類相同的方法 super init name 單...

class2 跨庫注入

如果要應用跨庫注入,有乙個條件,那就是當前資料庫使用者必須為root使用者,才可以對整個資料庫進行操作 確定使用者 user 確定使用者 如果回顯為root localhost或者root 127.0.0.1只要 號前面為root,則代表該資料庫使用者為root 跨庫注入過程 第一步 獲取當前所有的...

物件導向 class

class主要是避免 import導致死迴圈的問題 由於 class僅僅是告訴編譯器後面的名稱是乙個類,所以編譯器並不知道這個類中有哪些屬性和方法,所以在.m中使用這個類時需要import這個類,才能使用 class僅僅是告訴編譯器,class後面的名稱是乙個類,不會做任何的拷貝 具體使用 有乙個p...