1. 程式人生 > >Python之面向對象

Python之面向對象

imp on() 使用 編寫 starting min per 多繼承 elf

1》面向對象編程(Object-Oriented Programming):
  對於編程語言的初學者而言,OOP不是一個很容易理解的編程方式,OPP的三大特性有繼承,封裝,多態,OOP也使得我們對代碼的修改和擴展變得更容易;
   封裝:把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或對象操作,對不可信的進行信息隱藏;
   繼承:可以使用現有類的所有功能,並在無須重新編寫原來的類的情況下對這些功能進行擴展;一般情況下,一個子類只能有一個基類,要實現多重繼承, 可以通過多級繼承來實現;繼承概念的實現方式有三類:實現繼承,接口繼承和可視繼承;
      實現繼承:使用基類的屬性和方法而無需額外編碼的能力;
      接口繼承:僅使用屬性和方法的名稱,但是子類必須提供實現的能力;
      可視繼承:子類使用基類的外觀和實現代碼的能力;
     OOP開發範式大致為: 劃分對象->抽象類->將類組織成為層次化結構(繼承和合成)->用類與實例進行設計和實現;
  多態:允許將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之後,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運行;簡單的 說,允許將子類類型的指針賦值給父類類型的指針;
  封裝和繼承是為了代碼重用,而多態則是為了接口重用;
  把一個抽象的類變成一個具體的對象的過程叫實例化;

   1>類和構造方法:

       技術分享

     2>類的變量與實例變量:

        技術分享

         技術分享

技術分享

       3>類的繼承:
        class SchoolMember(object):
            membur_nums = 0
        def __init__(self,name,age,sex):
          self.name = name
          self.age = age
          self.sex = sex
          self.enroll()
        def

enroll(self):
          SchoolMember.membur_nums +=1
    # print("\033[32:1m The [%s] memburs SchoolMember [%s] is enrolled!\033[0m" %(self.membur_nums,self.name))
          
print("The [%s] memburs SchoolMember [%s] is enrolled!" % (self.membur_nums,
self.name))
      def
tell(self):
            print(
"Hello my name is %s" %self.name)
      class
Teacher(SchoolMember):
      
def __init__(self,name,age,sex,course,salary):
        super(Teacher,
self).__init__(name,age,sex)
        
self.course = course
        
self.salary = salary
      
def teaching(self):
        print(
"Teacher [%s] is teaching [%s]" %(self.name,self.course))
      class
Student(SchoolMember):
      
def __init__(self,name,age,sex,course,tuition):
        super(Student,
self).__init__(name,age,sex)
        
self.course = course
        
self.tuition = tuition
      
def pay_tuition(self):
        print(
"cao,student [%s] paying tuition [%s]" %(self.name,self.tuition))
     t1 = Teacher(
"Alex",22,‘F‘,"PY",1000)
     t2 = Teacher(
"Tenglan",25,‘N/A‘,"PY",900)

     s1 = Student(
"SanJiang",24,"Female","python",15000)
     s2 = Student(
"BaoAn",23,"F","python",5000)

     t1.tell()
     t1.teaching()
     s1.tell()
     s1.pay_tuition()

技術分享

    4>類的靜態方法類方法及屬性:
      ****python不支持多態並且也用不到多態,多態用於java和c#中;
     多態的應用: 

        技術分享

        技術分享

       類的成員可以分為三大類:字段,方法和屬性;

          技術分享

     1)字段:字段包括普通字段和靜態字段,他們在定義和使用中有所區別,而最本質的區別是內存中保存的位置不同,普通字段屬於對象,靜態 字段屬於類,普通字段需要通過對象來訪問,靜態字段通過類訪問;
      靜態字段在內存中只保存一份,普通字段在每個對象中都要保存一份;
      靜態字段===類變量,普通字段====實例變量;
    2)屬性(類方法):其中的裝飾器將方法變為類方法,只能通過類來調用,實例不可以直接調用;
      屬性的基本使用:  

技術分享

技術分享

類的靜態方法:不能訪問類變量,也不能訪問實例變量;

          技術分享

類的屬性,將方法變為屬性:

          技術分享

給屬性設置值:

          技術分享

           技術分享

       刪除屬性的設置值:

          技術分享

    4>新式類和經典類:
      1)多繼承:新式類用廣度優先查找,經典類用深度優先查找(3.0中都是廣度優先);    

         技術分享

2)類的描述信息:__doc__;

         技術分享

       3)類中實例銷毀:__del__(析構函數),一直將程序執行完之後會執行實例銷毀;

         技術分享

        技術分享

     4)__dict__ 以字典形式遍歷出類下的所有變量;

         技術分享

      5>反射的妙用:

        import sys
        class WebServer(object):
          def __init__(self,host,port):
            self.host = host
            self.port = port

          def start(self):
            print("Server is starting...")
          def
stop(self):
            print("Server is stopping...")
          def
restart(self):
            self.stop()
            self.start()

        def test_run(self,name):
          print("running...",name,self.host)

      if
__name__ =="__main__":
        server = WebServer(
‘localhost‘,333)
        
#print(sys.argv[1])
        
if hasattr(server,sys.argv[1]):
          func = getattr(server,sys.argv[
1]) #獲取server.start內存地址
          
func() #server.start()
        # setattr(server,"run",test_run) #類的實例,屬性,方法名
        # server.run(server,"che")

        # delattr(server,"host") #刪除實例中的對象
        # print(server.host)

        
delattr(WebServer,"start") #刪除類中的方法
          
print(server.restart())
        
# cmd_dic = {
            # "start":server.start,
            # "stop":server.stop,
            # "restart":server.restart,
            # }
      #if sys.argv[1] == "start":
      # if sys.argv[1] in cmd_dic:
      # cmd_dic[sys.argv[1]]()
 

技術分享

Python之面向對象