Try   HackMD

Class 程式碼

資訊之芽 2023 Python 語法班
Author: Sean 韋詠祥
Slide: https://hackmd.io/@Sean64/py-class

逐個複製太麻煩了,整理出來方便使用

如果我們想要紀錄

speaker1_name = 'Sean Wei'
speaker1_birthday = 'June'
speaker1_skills = ['Cybersecurity', 'Diving']

speaker2_name = 'William Mou'
speaker2_birthday = 'October'
speaker2_skills = ['Photography', 'Supercomputing']

speaker3_name = 'Sirius Koan'
speaker3_birthday = 'July'
speaker3_skills = ['Softball', 'Mail']

透過 dict 化簡

speaker1 = {
    'name': 'Sean Wei',
    'birthday': 'June',
    'skills': ['Cybersecurity', 'Diving']
}

speaker2 = {
    'name': 'William Mou',
    'birthday': 'October',
    'skills': ['Photography', 'Supercomputing']
}

speaker3 = {
    'name': 'Sirius Koan',
    'birthday': 'July',
    'skills': ['Softball', 'Mail']
}

如何使用 Class

class Speaker:
    pass

speaker1.name = 'Sean Wei'
speaker1.birthday = 'June'
speaker1.skills = ['Cybersecurity', 'Diving']

speaker2.name = 'William Mou'
speaker2.birthday = 'October'
speaker2.skills = ['Photography', 'Supercomputing']

speaker3.name = 'Sirius Koan'
speaker3.birthday = 'July'
speaker3.skills = ['Softball', 'Mail']

正確的寫法

class Speaker:
    def __init__(self, name, birthday, skills):
        self.name = name
        self.birthday = birthday
        self.skills = skills

speaker1 = Speaker('Sean Wei', 'June',
                   ['Cybersecurity', 'Diving'])

speaker2 = Speaker('William Mou', 'October',
                   ['Photography', 'Supercomputing'])

speaker3 = Speaker('Sirius Koan', 'July',
                   ['Softball', 'Mail'])

課堂練習(一)

class Speaker:
    def __init__(self, name, birthday, skills):
        self.name = name
        self.birthday = birthday
        self.skills = skills

    def learn(self, teacher):
        print(f'{self=}, {self.skills=}')
        print(f'{teacher=}, {teacher.skills=}')
        # Write your code here


speaker1 = Speaker('Sean Wei', 'June', ['Cybersecurity', 'Diving'])
speaker2 = Speaker('William Mou', 'October', ['Photography', 'Supercomputing'])
speaker3 = Speaker('Sirius Koan', 'July', ['Softball', 'Mail'])

speaker1.learn(speaker2)

繼承

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

    def say_hi():
        print(f'Hello, I am {name}!')


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

    def say_hi():
        print(f'Hello, I am {name}!')

抽取重複部分

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

    def say_hi():
        print(f'Hello, I am {name}!')


class Student(Person):
    def __init__(self, name, age, student_id):
        super().__init__(name, age)
        self.student_id = student_id


class Employee(Person):
    def __init__(self, name, age, employee_id):
        super().__init__(name, age)
        self.employee_id = employee_id

多層繼承的 super()

class First:
    def __init__(self):
        print('Initializing first class')
        # super().__init__()  # no need


class Second(First):
    def __init__(self):
        print('Initializing second class')
        super().__init__()


class Third(Second):
    def __init__(self):
        print('Initializing third class')
        super().__init__()


foo = Third()

對於繼承多個類別的 super() 呢?

class Foo:
    def __init__(self):
        print('Initializing foo class')
        super().__init__()  # note here


class Bar:
    def __init__(self):
        print('Initializing bar class')
        # super().__init__()  # no need


class Test(Foo, Bar):
    def __init__(self):
        print('Initializing test class')
        super().__init__()


baz = Test()

attribute 層級比較

class Phone:
    pwd = '0000'

foo = Phone()
bar = Phone()

print(f'{Phone.pwd=}, {foo.pwd=}, {bar.pwd=}')

為什麼我的 list 不乖

class Person:
    skills = []
    def learn(self, skill):
        self.skills.append(skill)


sean = Person()
sean.learn('Cybersecurity')
sean.learn('Diving')
print(f'{sean.skills=}')

mou = Person()
mou.learn('Photography')
mou.learn('Supercomputing')
print(f'{mou.skills=}')

正確寫法

class Person:
    def __init__(self):
        # creates a new empty list for each person
        self.skills = []

    def learn(self, skill):
        self.skills.append(skill)


sean = Person()
sean.learn('Cybersecurity')
sean.learn('Diving')
print(f'{sean.skills=}')

mou = Person()
mou.learn('Photography')
mou.learn('Supercomputing')
print(f'{mou.skills=}')

魔術方法

class Food:
    def __init__(self, price, calorie):
        self.price = price      # Unit: NTD
        self.calorie = calorie  # Unit: kcal


chicken_nuggets = Food(65, 260)
french_fries = Food(65, 530)
oreo_flurry = Food(55, 360)
corn_soup = Food(40, 90)

印出價格、熱量

class Food:
    def __init__(self, price, calorie):
        self.price = price      # Unit: NTD
        self.calorie = calorie  # Unit: kcal

    def __str__(self):
        return 'price and calorie is xxx'  # 小練習

    def __add__(self, other):
        price = 0    # 請完成
        calorie = 0  # 請完成
        mixture = Food(price, calorie)
        return mixture


chicken_nuggets = Food(65, 260)
french_fries = Food(65, 530)
oreo_flurry = Food(55, 360)
corn_soup = Food(40, 90)

oreo_nuggets = oreo_flurry + chicken_nuggets

print(oreo_nuggets)
# price = 120 NTD, calorie = 620 kcal

課堂練習(二)

class Food:
    # ...

    def __mul__(self, num):
        pass  # 計算 num 份食物的價格、熱量

    def __truediv__(self, num):
        pass  # 平分給 num 個人後每份長怎樣

    def __eq__(self, other):
        pass  # 比較「💲價格」是否相同,暫時無視熱量

    def __ne__(self, other):
        pass  # (optional) 比較「💲價格」是否不同

    def __gt__(self, other):
        pass  # 比較「🔥熱量」是否更高

    def __lt__(self, other):
        pass  # (optional) 比較「🔥熱量」是否更低

    def __ge__(self, other):
        pass  # (optional) 比較「🔥熱量」是否更高或相同

    def __le__(self, other):
        pass  # (optional) 比較「🔥熱量」是否更低或相同


chicken_nuggets = Food(65, 260)
french_fries = Food(65, 530)
oreo_flurry = Food(55, 360)
corn_soup = Food(40, 90)

print(oreo_flurry * 5)      # 五杯冰炫風多少錢
print(chicken_nuggets / 6)  # 每塊麥克雞塊熱量多高

print(french_fries + corn_soup > oreo_flurry)  # 薯條 + 玉米濃湯 > 冰炫風


結束!

感謝各位 owo//

BTW, SITCON 夏令營準備要開始報名了
https://www.instagram.com/p/Crs2yM3hlrW/

歡迎揪校內有興趣的同學抱團參加

回去有空可以看看上一屆的影片

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

資訊之芽 2023 Python 語法班
Author: Sean 韋詠祥
Slide: https://hackmd.io/@Sean64/py-class