1. 程式人生 > >python 面向對象介紹

python 面向對象介紹

IE .exe 復制 內存回收 接口 RM 回收機制 也有 實例對象

1、python 面向對象的主要特性。主要有類、對象。三大特點:封裝、繼承、多態。本次主要介紹內容:屬性、方法、構造函數、析構函數。私有方法、私有屬性。

oop 是使用類和對象來實現對真是世界的描述。萬事萬物皆可為類。基於面向對象的程序使人更加容易理解的你邏輯。提高開發效率

class 類。對具有相同屬性的對象的抽象。可以理解為模板。在類中定義了這些對象共同擁有的屬性和方法。(上帝創造地球的模板)

object 對象。對象是類的實例化。一個類可以實例化多個對象。每個對象可以具有不同的屬性。例如人。人與人既有共同屬性。也有不同屬性。

封裝。在內部調用函數。對外部是透明的(對外部不可見)。

 繼承。子類可以自動繼承父類的屬性和方法

多態。一個接口,多重實現。(比喻老板說開始工作,銷售部開始銷售工作。技術部開始的開發工作)

2、面向對象。類的簡單定義。和對象實例化。

class  dog:
    def __init__(self,name):
        self.name =  name
    def bulk(self):
        print("wang !!!!!!! %s"%(self.name))

dog1 =dog("test1")
dog2 = dog("test2")

dog1.bulk()
dog2.bulk()

3、寫代碼原則。

  一、重復代碼是非常不好的行為

二、寫的代碼經常變更

4、類初始化深入理解: 對象創建的過程。每次創建一個對象相當於開辟一塊內存空間如r1。每次在調用函數時候。實際相當於將r1作為一個參數傳遞給類的函數

(記住:是調用類的函數。所有對象公用。並不是每個對象的內存空間都會復制這個函數體,節省內存空間)

class role :
    def __init__(self,name,wepon,life_value= 00):
        #構造函數
        #在實例化時候。做一些初始化工作
        self.name = name
        self.wepon 
= wepon self.life_value = life_value def get_shot(self): print("I got shot") # 在內存中是完全不同的兩個對象 #role("xiajinqi","fireball") # r1 = role("xiajinqi","fireball") ‘‘‘ r1 = role("xiajinqi","fireball") 1、申請一個內存地址r1. 2、r1傳遞給類role 3、role.__init__(r1,"xiajinqi","fireball") 備註:創建一個對象。相當於開辟一塊內存空間。裏面會存儲變量等相關值。但是(類函數並沒有復制一份,只是在調用時候, 傳一個對象的內存地址來做區分不同的對象。好處就是節約內存空間), 如:role.__init__(r1,"xiajinqi","fireball") ,role.__init__(r2,"xiajinqi","fireball") ‘‘‘

內存存儲圖:

5、類變量和實例變量。 作用範圍。

當某個變量在類和實例中都存在時候。優先取實例變量

class role :
    n = 12345  #類變量,對象共享
    name = "tset"
    def __init__(self,name,wepon,life_value= 00):
        #構造函數
        #在實例化時候。做一些初始化工作
        self.name = name  #實例變量 。未某個對象所獨享
        self.wepon = wepon
        self.life_value = life_value
    def get_shot(self):
        print("I got shot")


print(role.n,role.name)
r1=role("ploice1","fireball")
r2=role("ploice2","fireball")

print(r1.n,r1.name) # 當name這個變量在實例和類都存在的。值先從對象開始找。沒有時候取類的變量打印值為ploice1
print(r2.n,r2.name)# 當name這個變量在對象和類種都存在的。值先從對象開始找。沒有時候取類的變量打印值為ploice2
#
E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/bin/test.py
12345 tset
12345 ploice1
12345 ploice2

Process finished with exit code 0

6、實例化以後。變量的修改和刪除增加。 特殊說明:對象可以查類變量(實例變量不存在取類變量),但是不能修改和刪除類變量。類變量修改只能由自己修改

如:r1.n = 100

.如果n存在,就表示修改。如果n不存在。

class role :
    n = 12345  #類變量,對象共享
    name = "tset"
    def __init__(self,name,wepon,life_value= 00):
        #構造函數
        #在實例化時候。做一些初始化工作
        self.name = name  #實例變量 。未某個對象所獨享
        self.wepon = wepon
        self.life_value = life_value
    def get_shot(self):
        print("I got shot")


print(role.n,role.name)

r1=role("ploice1","fireball")
r2=role("ploice2","fireball")
r1.n=11111  # 相當於實例r1自己給自己創建了一個變量n,r1.n=n。。因此不會改變類變量
print(r1.n) #
print(r2.n)#  # 類變量依舊不能變
print(role.n)
E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/bin/test.py
12345 tset
11111
12345
12345

7、類變量修改。類變量修改只能由類自己修改。所有實例都無法直接修改類變量。

並且類變量修改的影響範圍為:實例對象中沒有改變量,需要調用類變量的實例將受到影響。

class role :
    n = 12345  #類變量,對象共享
    name = "tset"
    def __init__(self,name,wepon,life_value= 00):
        #構造函數
        #在實例化時候。做一些初始化工作
        self.name = name  #實例變量 。未某個對象所獨享
        self.wepon = wepon
        self.life_value = life_value
    def get_shot(self):
        print("I got shot")


print(role.n,role.name)

r1=role("ploice1","fireball")
r2=role("ploice2","fireball")
r1.n=11111  # 相當於實例r1自己給自己創建了一個變量n,r1.n=n。。因此不會改變類變量
print(r1.n) #

# 修改類變量
role.n = 88888
print(r2.n)
print(role.n)

E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/bin/test.py
12345 tset
11111
88888
88888

Process finished with exit code 0


8、類變量的作業。例如:國際字段默認為中國。有少量人國際其他國際。所有未中國國際的人可以共用一個內存空間。從而節省內存。

9、析構函數。在實例銷毀、結束時候執行。通常用於關閉數據庫連接的打開的臨時文件關閉等

class role :
    n = 12345  #類變量,對象共享
    name = "tset"
    def __init__(self,name,wepon,life_value= 00):
        #構造函數
        #在實例化時候。做一些初始化工作
        self.name = name  #實例變量 。未某個對象所獨享
        self.wepon = wepon
        self.life_value = life_value

    def get_shot(self):
        print("I got shot")

    def __del__(self):
        print("ha game over")


# 程序執行結束後。自動調用
r1=role("ploice1","fireball")
r1.get_shot()
r2=role("ploice1","fireball")
r2.get_shot()


E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/bin/test.py
I got shot
I got shot
ha game over
ha game over

python 內存回收機制。當變量銷毀時候。會自動回收

class role :
    n = 12345  #類變量,對象共享
    name = "tset"
    def __init__(self,name,wepon,life_value= 00):
        #構造函數
        #在實例化時候。做一些初始化工作
        self.name = name  #實例變量 。未某個對象所獨享
        self.wepon = wepon
        self.life_value = life_value

    def get_shot(self):
        print("I got shot")

    def __del__(self):
        print("ha game over")


# 程序執行結束後。自動調用
r1=role("ploice1","fireball")
r1.get_shot()
del r1
r2=role("ploice1","fireball")
r2.get_shot()

E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/bin/test.py
I got shot
ha game over
I got shot
ha game over

Process finished with exit code 0

10、類的繼承。簡單實用

class People :
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def eat(self):
        print("%s eat" %(self.name))

    def sleep(self):
        print("%s sleep" % (self.name))

class Man(People):
     def game(self):
         print("%s game" % (self.name))

     def sleep(self):
         print("%s man is sleep" % (self.name))  # 覆蓋

     def eat(self):
         People.eat(self)  # 先調用父類。然後執行自己的函數體
         print("%s eat" % (self.name))  # 重構





man1 =Man("xiajinqi","19")
man1.sleep()  # 繼承父類。
man1.game()   # 玩遊戲。自己的類
man1.eat()  #重構

11、多繼承和新式類。繼承順序。從左到右。

# 繼承優先級,先執行自己的構造方法,再去調用Relation
#class Poeple: 經典類
class People(object) :   #新式類
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def eat(self):
        print("%s eat" %(self.name))

    def sleep(self):
        print("%s sleep" % (self.name))

class Relation(object):
    def make_friends(self):  # obj
        print("make  %s"%(self.name))

class Man(People,Relation):  # 新式類鞋碼
    def __init__(self, name, age, money):
        super(Man, self).__init__(name, age)
        self.money = money


    def game(self):
         print("%s game" % (self.name))

    def sleep(self):
         print("%s man is sleep" % (self.name))  # 覆蓋

    def eat(self):
         People.eat(self)  # 先調用父類。然後執行自己的函數體
         print("%s eat" % (self.name))  # 重構





man1 =Man("xiajinqi","19",10000)

man1.make_friends()


E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/bin/test.py
make fir xiajinqi

Process finished with exit code 0

12、類的繼承順序。廣度優先

class shoool(object):
    def __init__(self,addr,name):
        self.addr = addr
        self.name = name
        self.students = []
        self.teacher = []

    def  en_roll(self,obj_student):
        self.students.append(obj_student)
        print("註冊學員 %s"  %(obj_student.name))
    def  hire(self,obj_teacher):
        self.teacher.append(obj_teacher)
        print("註冊學員 %s" % (obj_teacher.name))

class school_member(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def tell(self):
        pass


class student(school_member):
    def __init__(self,name,age,grade):
        super(student,self).__init__(name,age)
        self.grade = grade

    def tell(self):
        print(‘‘‘
        name:
        age:
        garde:
        ‘‘‘%(self.name,self.age,self.garde))


class teacher(school_member):
    def __init__(self, name,age,salary):
        super(teacher, self).__init__(name,age)
        self.salary = salary

    def tell(self):
        print(‘‘‘
        name:
        age:
        salary:
        ‘‘‘ % (self.name, self.age, self.salary))


shoool1 = shoool("北京","老男孩")
student1 = student("test1","22","一班")
student2 = student("test2","22","二班")

teacher1 = teacher("teacher1","33","2000000")
teacher2 = teacher("teacher2","33","2000000")

shoool1.en_roll(student1)
shoool1.en_roll(student2)

shoool1.hire(teacher1)
shoool1.hire(teacher2)


# 打印所有註冊老師

for student in shoool1.students :
    print(student.name)


for teacher in shoool1.teacher :
    print(teacher.name)

13、多態.可以實現。統一接口多種實現。

class am(object):
    def __init__(self,name):
        print("name %s" %(name))

    # 接口
    def am(obj):
        obj.talk()


class dog(am):
    def talk(self):
        print("wangwang")

class cat(am):
    def talk(self):
        print("miaomiao")

dog1 = dog("test1")
cat2 = cat("test1")
am.am(cat2)

14課後練習題目:

角色:學校、學員、課程、講師
要求:
1、創建北京、上海學校
2、創建linux/python/C++ 3個課程 linxu/python 在北京開。C++在上海開。
3、課程包含。周期、價格。通過學校創建課程。
4、通過學校創建班級。班級關聯課程、講師
5、創建學員時,選擇學校。關聯班級
6、創建講師角色時要選擇學校
7、提供角色接口
7、1 學員視圖,可以註冊。交學費。選擇班級
7、2 講師視圖。講師可以管理自己的班級。上課選擇班級。查看班級學員列表。修改所管理學員的成績
7/3 管理視圖。創建講師、創建班級、創建課程
7/4上面所有操作通過pickel序列化保存到文件。

python 面向對象介紹