Python學習—物件導向學習下

來源:互聯網
上載者:User

標籤:協助文檔   字串   one   sel   有一個   注意   call   存在   對象   

物件導向下1.構造方法與析構方法
class People(object):    # 構造方法:__init__(),在執行個體化對象時自動執行的方法    def __init__(self, name, age):        self.name = name        self.age = age        print("建立對象成功.......")    #  解構函式:__del__(), 當你刪除對象時,自動調用的方法    #  刪除對象:del 對象名    def __del__(self):        print("刪除對象成功.......")
1.建構函式: init()

用於初始化類的內容部狀態,也就是當該類被執行個體化的時候就會執行該函數。那麼我們就可以把要先初始化的屬性放到這個函數裡面。
init()方法是可選的,如果不提供,Python 會給出預設的init方法。一般資料的擷取需要定義的get和set方法

2.解構函式: del()

當使用del 刪除對象時,會調用他本身的解構函式,另外當對象在某個範圍中調用完畢,在跳出其範圍的同時解構函式也會被調用一次,這樣可以用來釋放記憶體空間。
del()也是可選的,如果不提供,則Python 會在後台提供預設解構函式如果要顯式的調用解構函式,可以使用del關鍵字,方式:del 對象名

2.對象的strrepr方法

repr和str這兩個方法都是用於顯示的,str是面向使用者的,而repr面向程式員。
想使用print(Object)顯示對象,那就需要重構str。想直接輸入類對象Object來列印,那就需要重構repr,當然它也可以使用print(Object)顯示對象。區別在於:當你列印一個類的時候,那麼print首先調用的就是類裡面的定義的str方法,而不是repr方法,在沒有str方法時才會去調用repr方法。

#定義類>>> class Test():    def __init__(self):        self.ppx = "hello,python."#執行個體化類,然後想直接擷取類的一些資訊>>> t = Test()>>> t<__main__.Test object at 0x0000000002F3EF28>>>> print(t)<__main__.Test object at 0x0000000002F3EF28>

在沒有str或者repr方法時,上面列印類對象顯示的是對象的記憶體位址
下面我們重構下該類的repr以及str,看看它們倆的區別

>>> class TestRepr(Test):    def __repr__(self):        return "Show:%s"%self.ppx>>> t1 = TestRepr()>>> t1Show:hello,python.>>> print(t1)Show:hello,python.

可以看到,重構repr方法後,不管直接輸出對象還是通過print列印的資訊都按我們repr方法中定義的格式進行顯示

>>> class TestStr(Test):    def __str__(self):        return "Show:  %s"%self.ppx>>> t2 = TestStr()>>> t2<__main__.TestStr object at 0x00000000031C33C8>>>> print(t2)Show:  hello,python.

直接輸出對象ts時並沒有按我們str方法中定義的格式進行輸出,而用print(Object)輸出的資訊才會這樣顯示。

3.formate方法 1.通過位置來填充字串
print("hello %s" % (‘world‘))print("hello {0}".format((1, 2, 3, 4)))print("hello {0} {1} {0} {1}".format((1, 2, 3, 4), "python"))print("hello {0:.3f}".format(1.8989))運行輸出:hello worldhello (1, 2, 3, 4)hello (1, 2, 3, 4) python (1, 2, 3, 4) python
2.通過key來填充
print("max:{max} min:{min}".format(min=10, max=100))運行輸出:max:100 min:10
3.通過下標/index填充
point = (3,4)print("x:{0[0]}, y:{0[1]}".format(point))輸出:x:3, y:4
4.通過字典的key
d = {‘max‘:100.7849758475976, ‘min‘:10.4756895769857985}print("max:{max:.2f} min:{min:.3f}".format(**d))運行輸出:max:100.78 min:10.476
5. oop對象進行操作
class Book(object):    def __init__(self, name, author, state, bookIndex):        self.name = name        self.author = author        # 0:借出 1:未借出        self.state = state        self.bookIndex = bookIndex    # 列印對象時自動調用;str(對象)    def __str__(self):        return "書名:{0.name} 狀態:{0.state}".format(self)        # return "書名:{d.name} 狀態:{d.state}".format(d=self)b = Book("java", ‘aa‘, 1, ‘Index‘)print(b)運行輸出:書名:java 狀態:1
6. 對象中的format魔術方法
# 定義一個儲存年月日輸出格式的字典formats = {    ‘ymd‘:"{d.year}-{d.month}-{d.day}",    ‘mdy‘:"{d.month}/{d.day}/{d.year}",}class Date(object):    def __init__(self, year, month, day):        self.year = year        self.month = month        self.day = day    # format方法: format(對象名)時自動調用    def __format__(self, format_spec=None):        if not format_spec:            format_spec = ‘ymd‘        fmt = formats[format_spec] # "{d.year}-{d.month}-{d.day}".format(d=d)        return  fmt.format(d=self)d = Date(2019, 8, 25)print(format(d))    #不傳入參數print(format(d, ‘mdy‘))     #傳入參數運行輸出:2019-8-258/25/2019
4.關於@property

習慣了進階語言的嚴謹,總想對屬性加以存取控制,相對安全些,比如直接在init中定義公用屬性,從封裝性來說,它是不好的寫法。br/>屬性存取控制機制,其一是@propery關鍵字。用此關鍵字,其擷取、設定函數,須與屬性名稱一致。

from requests.compat import basestringclass Animal(object):    def __init__(self, name, age):        self._name = name        self._age = age        self._color = ‘Black‘    # 將普通方法變為屬性方法    @property    def name(self):        return self._name    # 當更改name的值時,自動調用下面這個方法。這樣就可以更改屬性的值了    @name.setter    def name(self, value):        if isinstance(value, basestring):            self._name = value        else:            self._name = ‘No name‘    #擷取值    @name.getter    def get(self):        return self.name    @property    def age(self):        return self._age    @age.setter    def age(self, value):        if value > 0 and value < 100:            self._age = value        else:            self._age = 0    @property    def color(self):        return self._color    @color.setter    def color(self, value):        self._color = value;a = Animal(‘black dog‘, 3)a.name = ‘white dog‘a.age = 55a.color = ‘red‘print(‘Name:‘, a.name)print(‘Age:‘, a.age)print(‘Color:‘, a.color)print(a.get)運行結果:Name: white dogAge: 55Color: redwhite dog
5.類裡面的切片與索引

魔術方法getitemsetitemdelitem
1.對列表的操作

class Student(object):    def __init__(self, name, scores):        self.name = name        self.scores = scores    # 支援索引; s[index]    def __getitem__(self, index):        # print("擷取索引對應的value值")        return  self.scores[index]    # s[索引] = 修改的值    def __setitem__(self, index, value):        self.scores[index] = value    # del s[索引]    def __delitem__(self, index):        del self.scores[index]    def hello(self):        return  "hello"s = Student(‘westos‘, [101, 100, 100])# *********************************索引**************************print(s[0])print(s[1])print(s[2])#更改值s[0] = 200print(s[0])print(s.scores)#刪除值del s[0]print(s.scores)# *********************************切片**************************print(s[1:3])s[1:3] = [0,0]print(s[:])del s[:-1]print(s[:])print(s[0])運行結果:101100100200[200, 100, 100][100, 100][100][100, 0, 0][0]0

2.對字典的操作

class Student(object):    def __init__(self, name, scores):        self.name = name        self.scores = scores    # 支援索引; s[key]    def __getitem__(self, key):        # print("擷取索引對應的value值")        return  self.__dict__[key]    # s[key] = 修改的值    def __setitem__(self, key, value):        self.__dict__[key] = value    # del s[key]    def __delitem__(self, key):        del self.__dict__[key]    def hello(self):        return  "hello"s = Student(‘westos‘, [101, 100, 100])#**************************key擷取value值***********************print(s.__dict__)print(s[‘name‘])print(s[‘scores‘])s[‘name‘] = ‘westo1‘print(s[‘name‘])del s[‘name‘]   #刪除一個索引值對# print(s[‘name‘])  #如果查值,會報錯:key不存在運行結果:{‘name‘: ‘westos‘, ‘scores‘: [101, 100, 100]}westos[101, 100, 100]westo1
6.call()方法

當一個類實現call方法時,這個類的執行個體就會變成可調用對象。即函數。
1.

class ClassA:    def __call__(self, *args, **kwargs):        print(‘call ClassA instance.......‘)# ClassA實現了__call__方法a = ClassA()#這個時候,ClassA的執行個體a,就變成可調用對象#調用a(),輸出call ClassA instance,說明是調用了__call__函數a()# 其實a()等同於a.__call__(),它本質上就是後者的縮寫a.__call__()運行結果:call ClassA instance.......call ClassA instance.......

2.

class Dddd(object):  def __init__(self, origin):    self.origin = origin    print("origin :"+str(origin))  def __call__(self, x):    print("x :"+str(x))p = Dddd(100)p(2000)運行結果:origin :100x :2000
7.實現一個單例模式
class Student(object):    def __init__(self, name, scores, power):        self.name = name        self.scores = scores        self.power = power    # 執行個體化對象之前先執行下面這個new魔術方法    def __new__(cls, *args, **kwargs):        # 判斷是否obj對象是否已經被建立, 如果沒有被建立, 則建立,        if not hasattr(cls, ‘obj‘):            cls.obj = object.__new__(cls)        # 如果已經建立成功,則返回建立好的對象        return  cls.objs1 = Student(‘westos1‘, [101,100,100], 100)s2 = Student(‘westos1‘, [101,100,100], 100)print(s1)print(s2)運行結果:<__main__.Student object at 0x7fedfa2ebef0><__main__.Student object at 0x7fedfa2ebef0>

可以看見,對象s1,s2他們指向的地址相同,即他們時同一個對象。而不是兩個相同值的對象。

8.類中的安全上下文with語句

enter()與exit()

class MyOpen(object):    def __init__(self, filename, mode=‘r‘):        self._name = filename        self._mode = mode    # 當with語句開始啟動並執行時候,執行此方法;    def __enter__(self):        self.f = open(self._name, self._mode)        return  self.f    # 當with語句執行結束之後運行;    def __exit__(self, exc_type, exc_val, exc_tb):        self.f.close()with MyOpen(‘/etc/passwd‘) as f:    print(f.closed)    print(f.read(5))print(f.closed)運行如果:Falseroot:True
9.反射

反射:主要是指程式可以訪問、檢測和修改它本身狀態或行為的一種能力(自省)。
python物件導向中的反射:通過字串的形式操作對象相關的屬性。python中的一切事物都是對象(都可以使用反射)。即 讓對象告訴我們相關資訊(對象擁有的屬性和方法, 對象所屬的類等....)

四個可以實現自省的函數

hasattr(object,name)
判斷object中有沒有一個name字串對應的方法或屬性,注意私人屬性或者方法不能判斷出來
getattr(object, name, default=None)
擷取object中有沒有對應的方法和屬性,私人屬性或者方法不能判斷出來不能擷取到。default是設定當擷取不到時的傳回值,預設為None
setattr(x, y, v)
修改或添加對象的屬性
delattr(x, y)
刪除類或對象的屬性

class Student(object):    """    這是student類的協助文檔    """    def __init__(self, name, age):        self.name = name        self.__age = age    def get_score(self):        return  "score"    def get_grade(self):        return ‘grade‘s1 = Student("fentiao", 10)print(type(s1))print(isinstance(s1, Student))print(isinstance(‘hello‘, Student))#  跟據對象可以擷取的內容print(s1.__class__) #類資訊print(s1.__dict__)  #產生字典print(s1.__doc__)   #擷取協助文檔#  hasattr, getattr, setattr, delattr# hasattr: 判斷對象是否包含對應的屬性或者方法名;print(hasattr(s1, ‘name‘))print(hasattr(s1, ‘__age‘))  # 私人屬性, 私人方法, 是不能判斷的;print(hasattr(s1, ‘score‘))print(hasattr(s1, ‘get_score‘))print(hasattr(s1, ‘set_score‘))# getattrprint(getattr(s1, ‘name‘))print(getattr(s1, ‘__age‘, ‘no attr‘))print(getattr(s1, ‘get_score‘, ‘no method‘))  # 擷取方法名, 如果要執行方法, 直接調用即可print(getattr(s1, ‘set_score‘, ‘no method‘))  # 擷取方法名, 如果要執行方法, 直接調用即可# setattr:# 修改某個屬性的值setattr(s1, ‘name‘, ‘westos‘)print(getattr(s1, ‘name‘))# 添加某個屬性及對應的值;setattr(s1, ‘score‘, 100)print(getattr(s1, ‘score‘))# 修改方法def get_score1():    return "這是修改的方法內容"setattr(s1, ‘get_score‘, get_score1)print(getattr(s1, ‘get_score‘)())def set_score():    return  "這是添加的方法"# 添加方法setattr(s1, ‘set_score‘, set_score)print(getattr(s1, ‘set_score‘)())# delattrdelattr(s1, ‘name‘)print(hasattr(s1, ‘name‘))print(hasattr(s1, ‘set_score‘))delattr(s1, ‘set_score‘)print(hasattr(s1, ‘set_score‘))運行結果:<class ‘__main__.Student‘>TrueFalse<class ‘__main__.Student‘>{‘name‘: ‘fentiao‘, ‘_Student__age‘: 10}    這是student類的協助文檔TrueFalseFalseTrueFalsefentiaono attr<bound method Student.get_score of <__main__.Student object at 0x7efc6b8a3ac8>>no methodwestos100這是修改的方法內容這是添加的方法FalseTrueFalse

Python學習—物件導向學習下

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.