1. 程式人生 > 實用技巧 >面向物件程式設計1

面向物件程式設計1

目錄

面向物件程式設計

1)、什麼是面向物件?

面向物件核心是物件二字,物件就是一個用來盛放資料與功能的容器

2)、面向物件程式設計與面向過程程式設計的關係

面向過程的特點是複雜程式碼流程化簡單化但是拓展性比較差

而面向物件程式設計的特點剛好與之相反,面向物件程式設計的特點是拓展性比較強但是程式設計的複雜度提高

3)、 類 與物件

類即類別、種類,是面向物件設計最重要的概念,物件是特徵與技能的結合體,而類則是一些列物件相似的特徵與技能的結合體。

在現實世界中:先有對比雙方比較 再有共同相似的概念

即先有物件再有類

在程式中:先定義類,後產生物件

在函式使用中,是先定義,後呼叫,類也是一樣的,在程式中需要先定義類,後呼叫類。不一樣的是,呼叫函式會執行函式體程式碼返回的是函式體執行的結果,而呼叫類會產生物件,返回的是物件。

引入:
同一個班級兩個同學的資訊  可以發現除了個人資訊不同  有相同的地方


def tell_info(student):
    print('my country is %s my name is %s my age is %s my gender is %s'%(student['country'],student['name'],student['age'],student['gender']))
student={
    'country':'China',
    'name':'egon',
    'age':18,
    'gender':'male',
    'tell_info':tell_info
}
student['tell_info'](student)

def tell_info(student):
    print('my country is %s my name is %s my age is %s my gender is %s'%(student['country'],student['name'],student['age'],student['gender']))
student={
    'country':'China',
    'name':'tom',
    'age':19,
    'gender':'female',
    'tell_info':tell_info
}
student['tell_info'](student)

my country is China my name is egon my age is 18 my gender is male
my country is China my name is tom my age is 19 my gender is female


# 因此這兩個程式碼有很多重複的地方  這裡就可以用到面向物件的概念
# 可以把相同的  共用的資料和功能放到類裡面 

3.1)、類的建立

定義類發生的事情
1、立即執行類體程式碼
2、將執行過程產生的名字都丟到類的名稱空間中
class Student:          #類名 駝峰體
    country = 'China'

    def tell_info(student):
        print('my country is %s my name is %s my age is %s my gender is %s'%(student['country'],student['name'],student['age'],student['gender']))

 	print('======>')
print(Student.__dict__)
    
>>> ======>
>>>{'__module__': '__main__', 'country': 'China', 'tell_info': <function Student.tell_info at 0x000001B3401A7CA0>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}


​ 3.2)、類的呼叫

1.0)呼叫類發生的事情
1、創造一個物件的字典,用來存放物件獨有的資料
2、將物件與類建立好關聯


obj1 = Student()
obj1.name = 'egon'  #obj1.__dict__['name'] = 'egon'
obj1.age = 18   # obj1.__dict__['age'] = 18
obj1.gender = 'male'    # obj1.__dict__['gender'] = 'male'


obj2 = Student()
obj2.name = 'william'
obj2.age = 19
obj2.gender = 'female'


print(obj1.__dict__)
print(obj2.__dict__)
print(Student.__dict__)
>>>{'name': 'egon', 'age': 18, 'gender': 'male'}
>>>{'name': 'william', 'age': 19, 'gender': 'female'}
>>>{'__module__': '__main__', 'country': 'China', 'tell_info': <function Student.tell_info at 0x0000024B6FA09700>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}


# 上面的程式碼可以寫成函式 傳入引數的形式
obj1 = Student()
obj2 = Student()

def init(self,x,y,z):
    self.name = x  # obj1.__dict__['name'] = 'egon'
    self.age = y  # obj1.__dict__['age'] = 18
    self.gender = z  # obj1.__dict__['gender'] = 'male'

init(obj1,'egon',18,'male')
init(obj2,'tom',19,'female')

print(obj1.__dict__)
print(obj2.__dict__)

print(Student.__dict__)

>>>{'name': 'egon', 'age': 18, 'gender': 'male'}
>>>{'name': 'tom', 'age': 19, 'gender': 'female'}
>>>{'__module__': '__main__', 'country': 'China', 'tell_info': <function Student.tell_info at 0x000002B308DF9700>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}



對比發現其實在一系列優化中,都是把相似的類 放到類裡面 類的目的就是物件

在這個案例中除了個人資訊不同 其他都相同

class Student:          #類名 駝峰體
    country = 'China'
    def __init__(self,x,y,z):
        self.name = x  # 空物件.name= 'egon'
        self.age = y  # 空物件.age = 18
        self.gender = z  # 空物件.gender = 'male'
    
    def tell_info(student):
        print('my name is %s my age is %s my gender is %s '%(student['country'],student['name'],student['age'],student['gender']))
        
 

2.0) #重新定義呼叫類的過程
1、先創造一個空物件
2、自動觸發類內的__init__函式的執行,將空物件當作第一個引數自動傳入
3、返回一個初始化好的物件  給obj1

obj1 = Student('egon',18,'male')
obj2 = Student('tom',19,'female')




# 功能實現展示