1. 程式人生 > 其它 >python-面向物件(一)

python-面向物件(一)

目錄

1. 面向物件由來

1.面向過程程式設計:定義變數,定義函式
    優點:複雜的問題流程化,進而簡單化
    缺點:牽一髮而動全身,擴充套件性差,可維護性差
    應用場景:對擴充套件性要求不高的地方
2.面向物件程式設計:定義一個類,類有屬性(變數、特徵),有方法(函式,技能)
		優點:擴充套件性強,可維護性強
    缺點:程式設計複雜度高
    應用場景:對擴充套件性要求較高的地方

2. 面向物件程式設計

1 面向過程變成的核心是過程二字,過程指的是解決問題的步驟,即先幹什麼再幹什麼然後幹什麼
2 面向物件程式設計的核心是物件二字,物件是特徵與技能的結合體,盛放資料和函式的容器

3. 類和物件

# 必須先定義類,然後呼叫類產生物件
# 定義了類 Person
class Person():  # 類名首字母一般情況大寫,使用大駝峰法命名
    # 定義屬性
    weight = 90
    height = 180
		
    # 定義技能(函式)
    def sleep1(self):
        print('睡覺')

'''
定義類:
        1. 立即執行類體程式碼
        2. 產生一個類的名稱空間,把類體裡面執行的名字都扔到名稱空間中(大字典)
        3. 把類的名稱空間繫結給__dict__, 類名.__dict__
'''
      
# 檢視類的名稱空間
print(Person.__dict__)  

# 呼叫類產生物件,預設產生的就是一個空物件{}
zhangsan = Person()  # 類的例項化,得到物件

# 使用物件
zhangsan.sleep1()  # 睡覺
print(zhangsan.height)  # 180

4. 定製物件獨有特徵

class Person():
    weight = 90
    height = 180

    def sleep1(self):
        print('睡覺')
zhangsan = Person()
zhangsan.city = 'BJ'  # 給shangsan物件定製獨有的特徵
print(zhangsan.city)  # BJ

5. __init__方法

# 物件在例項化的時候,賦初值(給物件一些屬性)
# 老方法
class Student():
    def choose_course(self):
        print('選課')


s1 = Student()
s1.name = 'json'
s1.age = 18

print(s1.name)  # json

# __init__的使用
class Student():
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def choose_course(self):
        print('選課')


s1 = Student('tom', 18)  # 這種初始化方式會觸發類的__init__的執行,並把引數傳入
print(s1.name)

6. 屬性的查詢順序

# 屬性的查詢:先從自己的物件中查詢,然後在去產生物件的類中取找
class Student():
    school = 'Harvard University'

    def __init__(self, name, age, gender, course=None):
        if course is None:
            course = []
        self.name = name
        self.age = age
        self.gender = gender
        self.course = course

    def choose_course(self, course):
        self.course.append(course)
        print('%s 選課成功 %s ' % (self.name, self.course))


s1 = Student('bob', 18, 'male')
print(s1.__dict__)  # {'name': 'bob', 'age': 18, 'gender': 'male', 'course': []}
s1.choose_course('python')  # bob 選課成功 ['python'] 
print(s1.__dict__)  # {'name': 'bob', 'age': 18, 'gender': 'male', 'course': ['python']}

'''
屬性的查詢:
	1. 類屬性: 在類中寫的屬性就稱為類屬性
	2. 物件屬性:在物件自己的名稱空間中的屬性就是物件屬性
'''

# 1.類屬性的查詢
# 查
print(Student.school)

# 增
Student.country = 'USA'  # 後面例項化的新物件才會有
print(Student.country)

# 刪
del Student.school
print(Student.__dict__)  # 刪除了school屬性

# 改
Student.school = 'Oxford'
print(Student.school)  # Oxford

# 2.物件的屬性查詢

# 查
print(s1.name)  # bob

# 增
s1.height = 180
print(s1.__dict__)  # 多了height

# 刪
del s1.age
print(s1.__dict__)  # age 沒有了

# 改
s1.name = 'tony'
print(s1.name)  # tony


# 判斷物件是否是某個類例項化的

class Teacher():
    pass


print(isinstance(s1, Student))  # True
print(isinstance(s1, Teacher))  # False