1. 程式人生 > >面向物件能做什麼和特性及巢狀

面向物件能做什麼和特性及巢狀

面向物件幫我們解決什麼問題?

  面向物件的風封裝的這個特性幫助我們解決了兩個問題

    1.歸類: 將方法和靜態變數放置到一個類中
    2.打包: 將資料打包到一個物件

 

面向物件的三大特性

封裝,繼承,多型

  1.封裝: 幫我們解決一些方法和屬性進行分類,讓程式碼更加的清晰,提高可讀性提高

  2.繼承: 提高程式碼的複用性,將具有相同的屬性和方法提取出來

  3,多型: python原生支援多型,崇尚鴨子模型,由於python函式傳參時,無需指定引數型別

對於物件(self)的跟蹤: 

self引數是這例項化的過程中幫助我們自動傳遞的.所以在繼承中是,對於結果的輸出時.要看self是誰的物件空間,這會才能確定輸出的結果是誰

在python中支援多繼承,這會對抽象類和介面類的使用會提供很大的幫助

類中的成員

分成三類:

  1.變數:

    1.例項變數(又可以說是欄位):1),公有例項變數2),私有例項變數

例項一:
                        class Foo:
                            # 類變數(靜態欄位)
                            country = "中國"
                            
                            def __init__(self,name):
                                
# 例項變數(欄位) self.name = name def func(self): pass obj1 = Foo('阿童木') obj2
= Foo('葫蘆娃') Foo.country

    2.類變數: 1),公有類變數2),私有類變數

無法訪問:
                        class Base(object):
                            __secret = "受賄"

                        class Foo(Base):

                            def func(self):
                                print(self.__secret)
                                print(Foo.__secret)


                        obj = Foo()
                        obj.func()
                                        
可以訪問:
                        class Base(object):
                            __secret = "受賄"

                            def zt(self):
                                print(Base.__secret)


                        class Foo(Base):

                            def func(self):
                                print(self.__secret)
                                print(Foo.__secret)


                        obj = Foo()
                        obj.zt()

  2.方法:

    例項方法

class Foo(object):
                            def __init__(self, name):
                                self.name = name

                            # 例項方法
                            def func(self):
                                print(self.name)
                                
                        obj = Foo('..')
                        obj.func()

    靜態方法

class Foo(object):
                            def __init__(self, name):
                                self.name = name

                            # 靜態方法,如果方法無需使用物件中封裝的值,那麼就可以使用靜態方法
                            @staticmethod
                            def display(a1,a2):
                                return a1 + a2
                        Foo.display(1,3)

    類方法

class Foo(object):
                        
                            # 類方法,cls是類
                            @classmethod
                            def show(cls,x1,x2):
                                print(cls,x1,x2)

                        # 執行類方法
                        Foo.show(1,8)

  3.屬性(通過方法改造出來):

                    class Foo(object):
                        def __init__(self):
                            pass

                        @property
                        def start(self):
                            return 1

                        @property
                        def end(self):
                            return 10

                    obj = Foo()
                    print(obj.start)
                    print(obj.end)
總結:
  1.編寫時:
    方法上方寫@property
    方法引數:只有一個self
  2.呼叫時: 無需加括號 物件.方法
  3.應用場景:對於簡單的方法,當無需傳參且有返回值時,可以使用@property

巢狀:

  面向物件:

"""
                建立三個學校且三個學校的設施內容等都是一致.
                """

                class School(object):
                    def __init__(self, name, address):
                        self.name = name
                        self.address = address

                    def speech(self):
                        print('講課')

                obj1 = School('老男孩北京校區', '美麗富饒的沙河')
                obj2 = School('老男孩上海校區', '浦東新區')
                obj3 = School('老男孩深圳校區', '南山區')
                class Teacher(object):
                    def __init__(self, name, age, salary):
                        self.name = name
                        self.age = age
                        self.__salary = salary
                        self.school = None

                t1 = Teacher('李傑', 19, 188888)
                t2 = Teacher('豔濤', 18, 60)
                t3 = Teacher('女神',16, 900000)
                # ############## 老師分配校區
                t1.school = obj1
                t2.school = obj1
                t3.school = obj2
                # ####################################
                # 檢視t1老師,所在的校區名稱/地址
                print(t1.school.name)
                print(t1.school.address)
                print(t1.name)
                print(t1.age)
                t1.school.speech()
準則:欄位和方法的歸類