0. Python 介绍班:class
😆:Python 介绍 class 班是上什么课?
👸:是不是象 Java 那样的 Object 物体吗?还是 Bean 豆豆?我脸上有没有长痘痘?
👦: 还是象 Kotlin,加了 资料类的 data class?
Python(🐍吐着sss) :都是,我的喜好是 自由发挥。class 是 particular type of object 特定对象。可以是资料,可以是方程,可以两者都是。咦?怎么都跑了,本大仙形象那么差吗?
👩🏫1. Class:上课啦!
我用的是 PyCharm。加个 example project 例子项目。
开头,它自己就会加个 main.py。
如果它问你要 interpreter 翻译?你就指一个给它呗。
这是 class:
# example
class Basic:
"""basic class 基础班"""
variable = 123
def show(self):
return "This is a basic class -- 这是基础班。"
然后在 main 里面🏃🏻跑啊:
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
c = Basic()
classTitle = c.show()
print(classTitle)
意思:如果是本尊, 干这些活。结果:
D:\kivy\kivy_venv\Scripts\python.exe D:/pycode/example/main.py
This is a basic class -- 这是基础班。
Process finished with exit code 0
🌟2. 启动方程
constructor,很多语言都用,启动用的。Python也不例外,它用的是
init
例子:
class Circle:
def __init__(self, center, radius):
self.center = center
self.radius = radius
def area(self):
return pi * self.radius * self.radius
很简单。main:
point = (20, 20)
r = Circle(point, 15)
print("Circle area: %d" % (r.area()))
答案 3.14x15x15 = 706.5:
Circle area: 706
看来 Integer 没有四舍五入。🤔玩玩,换小数点后两位。
print("Circle area: %.2f" % (r.area()))
出来:
Circle area: 706.86
浮数有四舍五入。
👪3. 父子关系
…
先写老爸:🐦
# 父母 class
class Bird:
def __init__(self):
print("启动:鸟")
def whoisThis(self):
print("鸟类")
…
生个企鹅:🐧
# 儿女 class
class Penguin(Bird):
def __init__(self):
# call super() function
super().__init__()
print("启动:企鹅")
def whoisThis(self):
print("Penguin 企鹅")
def run(self):
print("奔跑速度:一摇三摆")
def swim(self):
print("游泳:快速")
…
呵呵,咱接着生,这次产只鸡:🐣
# 儿女 class
class Chicken(Bird):
def __init__(self):
# call super() function
super().__init__()
print("启动:鸡")
def whoisThis(self):
print("Chicken 鸡")
def run(self):
print("奔跑速度:中速")
def fly(self):
print("飞行:超低空,高度十米内。")
…
🔑Main
print('\n父子类 class:')
daYa = Penguin()
daYa.whoisThis()
daYa.run()
daYa.swim()
print('\n下一种,父子类 class:')
rock = Chicken()
rock.whoisThis()
rock.run()
rock.fly()
…
🏇跑啦:
父子类 class:
启动:鸟
启动:企鹅
Penguin 企鹅
奔跑速度:一摇三摆
游泳:快速
下一种,父子类 class:
启动:鸟
启动:鸡
Chicken 鸡
奔跑速度:中速
飞行:超低空,高度十米内。
🦸♂️4. 父子的 Super 超人关系
…
🍝加料老爸:
# 父母 class
class Bird:
def __init__(self, birdName):
self.birdName = birdName
print("启动:鸟. 名称: ", birdName)
...
def walk(self, birdName):
print(self.birdName, " 能够用双足行走。")
…
🦸超级企鹅:🐧
# 儿女 class
class Penguin(Bird):
def __init__(self):
# call super() function
super().__init__('企鹅')
print("启动:企鹅")
...
…
🦸超级鸡: 🐔
# 儿女 class
class Chicken(Bird):
def __init__(self):
# call super() function
super().__init__('鸡')
print("启动:鸡")
...
…
🔑Main
print('\n父子类 class:')
daYa = Penguin()
daYa.whoisThis()
daYa.run()
daYa.swim()
daYa.walk()
print('\n下一种,父子类 class:')
rock = Chicken()
rock.whoisThis()
rock.run()
rock.fly()
rock.walk()
…
🏇跑啦:
父子类 class:
启动:鸟. 名称: 企鹅
启动:企鹅
Penguin 企鹅
奔跑速度:一摇三摆
游泳:快速
企鹅 能够用双足行走。
下一种,父子类 class:
启动:鸟. 名称: 鸡
启动:鸡
Chicken 鸡
奔跑速度:中速
飞行:超低空,高度十米内。
鸡 能够用双足行走。
总的来说,有点像轮回关系。
💃5. class 说: 我自由啦!
…
😍加个自由 class
class Person():
pass
😲:就这样?
😎:就是这个样。
…
《✌️》 加变量
print('\n自由 class 课堂戏剧:')
lisa = Person()
# 加个变量名称: key
first_key = '名称'
first_val = '丽莎'
last_key = '姓氏'
last_val = '蒙你'
# 组成 lisa 这个人
setattr(lisa, first_key, first_val)
setattr(lisa, last_key, last_val)
# 直接打
setattr(lisa, 'age', 23)
…
《💡》使用方法:getattr 或 用点
name = getattr(lisa, last_key) + getattr(lisa, first_key)
print('主角名称: ', name)
print(f'新生: 你好, {lisa.名称}小姐!你多大了?')
print(f'{lisa.名称}: 我今年 {lisa.age}。')
print('新生:青春少女喔!可不可以问问,贵姓哪?')
print(f'{lisa.名称}: 姓{lisa.姓氏}喔。')
print('新生:是嘛,这个姓氏真少见!')
…
《🎭》 输出:
自由 class 课堂戏剧:
主角名称: 蒙你丽莎
新生: 你好, 丽莎小姐!你多大了?
丽莎: 我今年 23。
新生:青春少女喔!可不可以问问,贵姓哪?
丽莎: 姓蒙你喔。
新生:是嘛,这个姓氏真少见!
💃5. class 说: 我要加帮手!
方程可以外挂吗?
👌🏻 : 没问题!加个 patch 方程
…
{✔️} 狠 get 外挂
def patch(mClass):
# 外挂
def skill(self, x):
return f'我的特殊技能是: {x}'
mClass.skill = skill.__get__(mClass)
用 “__ get __” 增加 skill 方程。
…
{✔️} 使用外挂
print('新生:你有什么爱好吗!')
patch(lisa)
print(f'{lisa.名称}: {lisa.skill("爬树")}')
…
{🎭} 输出:
新生:你有什么爱好吗!
丽莎: 我的特殊技能是: 爬树
🍖6. 摘要班: Abstract Class
😎:秘书啊,按这个摘要加班,必须完成任务。
👩🦱 :是, 老板!
什么是 Abstract Class?就是一种 Class, 包括固定式方程的家伙。这个死皮赖脸的方程一定是自个产生的,非外来户。还有这寄生虫🐛穷啊,没资料,你要在新儿子那里给这家伙加挂。
…
Abstract 就是 ABC:
老妈的 class:
# 父母 class:纸张
class Paper(ABC):
def __init__(self, value):
self.roll = value
super().__init__()
@abstractmethod
def 用途(self):
pass
@abstractmethod
def 价钱(self):
pass
…
加两个儿子和主程序:
# 儿女 class: 干湿两用纸
class Towel(Paper, ABC):
def 用途(self):
return '吸水能力:超强!'
# 儿女 class:厕纸
class BathTissue(Paper, ABC):
def 用途(self):
return '水解能力: 快速!'
def 价钱(self):
return '¥20 per 12 卷.'
一个儿子少了价钱。
Main
:
print(f'干湿两用纸 是 {towel.roll} / 卷. '
f'\n\t用途: {towel.用途()}')
print(f'厕纸 是 {tissue.roll} / 卷. '
f'\n\t用途: {tissue.用途()}'
f'\n\t价钱: {tissue.价钱()}')
…
{🎭} 输出:Error
Traceback (most recent call last):
File "D:/pycode/example/main.py", line 169, in <module>
towel = Towel(100)
TypeError: Can't instantiate abstract class Towel with abstract methods 价钱
瞧,它说找不到 价钱 这个方程,无法运作。
你得非加上去不可,这就是 abstract class 的价值: 我要的,你就 必须
给我安上去。
来,让我们补一补:
👱♂️:爸,我要人参,鹿茸,冬成夏草。
👨:吃蒙了你!小孩子不能吃这些东西,会死人的。乖儿子,我把冬成夏草换成虫草花,煲汤给你喝啊。
🐍:SSS,两位,这里不是饮食节目。上隔壁去。
👱♂️👨:啊…
…
# 儿女 class: 干湿两用纸
class Towel(Paper, ABC):
def 用途(self):
return '吸水能力:超强!'
def 价钱(self):
return '¥60 per 12 卷.'
Main
:
print(f'干湿两用纸 是 {towel.roll} / 卷. '
f'\n\t用途: {towel.用途()}'
f'\n\t价钱: {towel.价钱()}')
print(f'厕纸 是 {tissue.roll} / 卷. '
f'\n\t用途: {tissue.用途()}'
f'\n\t价钱: {tissue.价钱()}')
…
{🎭} 输出:
干湿两用纸 是 100 / 卷.
用途: 吸水能力:超强!
价钱: ¥60 per 12 卷.
厕纸 是 150 / 卷.
用途: 水解能力: 快速!
价钱: ¥20 per 12 卷.
👩🦱 :恭喜你,老板!摘要成功了!
😎:嗯,不错不错!