公共成員:可以在類的外部訪問到。我們之前接觸到的都是公共成員
私有成員:只能在該類的內部才能直接訪問到的(子類也不能直接訪問);在外部,可以通過間接方法才能取得。 以欄位(普通欄位和靜態字段相同)為例,開頭加__(雙下劃線)使欄位變為私有字段;方法也一樣,方法名前面加__(雙下劃線)即可。
class db:1、 構造方法 __init__方法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方法才能拿到
類() 自動執行
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:print操作,其實是兩個步驟:print(abc) == print(str(abc))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__方法返回的值
步驟一: 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...