python面向對象

一、類和對象

1、萬物皆對象

2、對象:用來描述客觀事物的一個實體,由一組屬性方法構成

3、屬性:對象具有的各種特徵,每個對象的每個屬性都有特定值

4、方法:對象執行的操作

5、類:對象的分類,分類就是認識對象的過程

面向對象設計的規則

1、圖書類: 屬性:圖書編號、書名、書的作者、上架日期、借出狀態

                 功能(方法):借出和歸還

2、銀行卡類: 屬性:卡號、銀行卡名稱、密碼、姓名、餘額

     方法:登入、存款、取款

二、面向對象創建:定義某個類的對象具有的屬性(變數)和方法(函數)

# 思路:
# 定義類 --> 人類
# 編寫類的屬性:姓名、年齡、id(身份證號)、手機號
# 編寫類的方法:吃、喝、玩、睡、上班
class Person:
    # 編寫屬性(變數)
    name = "楊冪"
    age = 30
    gender = ''

    # 我不想用指定屬性,我想自己創建姓名
    def set_param(self, name):  # age、gender一樣操作
        self.name = name
        print(f'姓名:{self.name}')  
    # 如屬性很多,那就很麻煩,我們可以使用 def __init__()去構造

    # 編寫方法(函數),無參
    def eat(self):
        print('eating')

    def drink(self):
        print('drinking')

    def play(self):
        print('playing')

    def sleep(self):
        print('sleeping')
    
    @classmethod
    def work(self):
        print('working')


# 對象的構造
YM = Person()
# 調用方法
YM.sleep()
YM.work()

zs = Person()
zs.set_param('張三')

# 類訪問方法,需要添加一個裝飾器@classmethod
Person.eat()
# def __init__() 去構造屬性
class Person:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender

    # 編寫方法(函數),有參
    def eat(self, food):
        print(f'{self.name}在吃{food}')

    def drink(self, sthing):
        print(f'{self.name}在喝{sthing}')

    def play(self):
        print(f'{self.name}在玩')

    def sleep(self):
        print(f'{self.name}在睡覺')

    def work(self):
        print(f'{self.name}正在工作')

    def info(self):  # 輸出資訊
        print("該人的資訊:", self.name, self.age, self.gender)


# 構造對象輸出資訊
lihaoran = Person(name='李浩然', age=32, gender='')
# 調用方法
lihaoran.info()
lihaoran.work()
lihaoran.sleep()

三、面向對象思想:封裝、繼承、多態

1、封裝(屬性私有化)

 

  •  私有屬性可以被查看,但是不能被修改 —> get方法

 

  •  私有屬性不被外界查看,但可以被外界修改 —> set方法】

 

"""封裝(屬性私有化)"""


class Student:
    def __init__(self, name, age, xh, id, address):
        self.name = name  # 默認公共屬性(允許外界讀取+修改)
        self.age = age  # 默認公共屬性(允許外界讀取+修改)
        self.xh = xh
        self.__id = id  # 私有屬性(不允許外界讀取+修改)
        self.__address = address  # 私有屬性(不允許外界讀取+修改)

    # 私有屬性可以被查看,但是不能被修改  ---> get方法
    def getid(self):
        return self.__id

    def setaddress(self, newadress):
        self.__address = newadress

    def info(self):
        print('學生的基本資訊:', self.name, self.age, self.xh, self.__id, self.__address)


zhangsan = Student('Tom', 18, '001', '340104555555555555', '南京')

# 私有屬性(不允許外界讀取+修改),如果想查看get方法
# print(zhangsan.id)  # 沒有getid-->報錯AttributeError: 'Student' object has no attribute 'id'
read_student_id = zhangsan.getid()
print(f'查看張三id:{read_student_id}')

zhangsan.info()
zhangsan.setaddress("合肥")
zhangsan.info()

2、繼承、多態

  •  繼承在父類基礎上構造出新的類,子類可以擁有繼承**父類的屬性和方法
  • 多態:指一個對象可以用子類的特點也可以父類的特徵

 

 

 

 

class Animal:
    def __init__(self, name, color):
        self.name = name
        self.color = color

    def eat(self, food):
        print(f'{self.name}在吃{food}')

    def drink(self, sthing):
        print(f'{self.name}在喝{sthing}')

    def play(self):
        print(f'{self.name}在玩')

    def sleep(self):
        print(f'{self.name}在睡覺')


# 繼承
class Dog(Animal):
    def __init__(self, name, color, age):
        super().__init__(name, color)  # super()調用父類對象
        self.age = age  # 屬性有個性(構造屬性重寫)

    def kaijia(self):
        print(f"{self.name}看家")


hashiqi = Dog('哈士奇', '黑白', 6)
hashiqi.eat('骨頭')

# 多態 方法上個性(構造方法重寫) 獨特個性
hashiqi.kaijia()


class Cat(Animal):
    def __init__(self, name, color):
        super().__init__(name, color)  # super()調用父類對象


cat = Cat('波斯貓', 'red')
cat.eat('')
# cat.kaijia() 因為貓不會看家,這是狗的獨特個性