面向對象編程——類(class)2

1、類成員修飾符

公共成員:能夠在類的外部訪問到。咱們以前接觸到的都是公共成員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方法才能拿到

 

2、類中的特殊成員

一、 構造方法 __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__方法。

metaclass,元類,原始類,類的祖先

在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()

 

以上感謝武老師的博客。

反射

單例模式

相關文章
相關標籤/搜索