公共成員:能夠在類的外部訪問到。咱們以前接觸到的都是公共成員python
私有成員:只能在該類的內部才能直接訪問到的(子類也不能直接訪問);在外部,能夠經過間接方法才能取得。 以字段(普通字段和靜態字段相同)爲例,開頭加__(雙下劃線)使字段變爲私有字段;方法也同樣,方法名前面加__(雙下劃線)便可。web
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方法才能拿到
一、 構造方法 __init__方法bash
類() 自動執行
二、 相似構造方法,這裏是一個特殊的調用方法 __call__方法ssh
對象() 或者 類()() 自動執行
class foo: def __init__(self): print("in init") def __call__(self,*args,**kwargs): print("in call") obj = foo() # 建立對象 obj obj() # 對象後面加括號,調用,則執行類中的__call__方法
三、 特殊方法 __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__)方法。spa
咱們用的比較多的是__str__方法。 使用案例:code
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 0x0000018941FEB3C8>。定義了 __str__方法後,則打印 __str__方法返回的值
print操做,實際上是兩個步驟:print(abc) == print(str(abc))對象
步驟一: str(abc) ,調用 abc的__str__方法,獲得返回值。 步驟二: print打印這個返回值。blog
四、 __dict__方法 ,對象裏自帶的 重要ip
class foo: def __init__(self,name,age): self.name = name self.age = age self.id = None obj = foo("bash",22) print(obj.__dict__) # 返回一個字典 {'name': 'bash', 'age': 22, 'id': None} 這是這個對象的全部成員。若是成員是私有成員,則該成員的key爲 _類名+該私有成員名 print(foo.__dict__) # 返回一個字典,這個類的全部成員。 若是成員是私有成員,則該成員的key爲 _類名+該私有成員名
五、 for循環拆解
for循環遇到的對象是一個迭代器,則直接執行該對象的__next__方法。
for循環遇到的對象是一個可迭代對象,則先執行__iter__方法來獲取迭代器,而後再執行__next__方法。
在python中,一切事物皆是對象。
__new__ 和 __metaclass__ 方法
建立類就能夠有兩種方式:
a). 普通方式
class Foo(object): def func(self): print 'hello wupeiqi'
b).特殊方式(type類的構造函數)
def func(self): print 'hello wupeiqi' Foo = type('Foo',(object,), {'func': func}) #type第一個參數:類名 #type第二個參數:當前類的基類 #type第三個參數:類的成員
類默認是由 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()
以上感謝武老師的博客。