13.1类 与 自身
用 类 关键字定义类,方法用 函数 定义,实例自身写作 自身(等价于 Python 的 self):
cql
# 定义一个最简单的类
类 动物:
函数 叫(自身):
返回 "……"
打印(动物().叫()) # ……(先实例化再调用方法)13.2构造方法 __init__
定义 函数 __init__(自身, ...) 作为构造方法,在实例化时自动执行,用于初始化属性:
cql
# 构造方法 __init__
类 狗:
函数 __init__(自身, 名字):
自身.名字 = 名字
函数 叫(自身):
返回 "汪汪!我是" + 自身.名字
旺财 = 狗("旺财")
打印(旺财.叫()) # 汪汪!我是旺财13.3继承
用 类 子类 继承 父类 实现继承,子类自动拥有父类的方法与属性,也可以覆盖它们:
cql
# 继承:狗 继承 动物
类 动物:
函数 叫(自身):
返回 "……"
类 狗 继承 动物:
函数 叫(自身):
返回 "汪汪!"
打印(狗().叫()) # 汪汪!(子类覆盖了父类方法)13.4方法重写与多态
不同的子类重写同一个方法后,用同一个调用点就能得到不同的行为,这就是多态。完整示例参考 examples/class_polymorphism.cql:
cql
# CQL 示例:类与继承、多态
类 动物:
函数 叫(自身):
返回 "……"
类 狗 继承 动物:
函数 叫(自身):
返回 "汪汪!"
类 猫 继承 动物:
函数 叫(自身):
返回 "喵喵!"
类 会说话的狗 继承 狗:
函数 叫(自身):
返回 超类().叫() + " 我还会说话!"
函数 让它叫(动物):
打印(动物.叫())
打印("--- 多态演示 ---")
让它叫(动物())
让它叫(狗())
让它叫(猫())
让它叫(会说话的狗())out
--- 多态演示 ---
……
汪汪!
喵喵!
汪汪! 我还会说话!13.5超类
用 超类()(等价于 Python 的 super())在子类中调用父类的方法。上面的"会说话的狗"就通过 超类().叫() 先取得父类"汪汪!"再拼接自己的话:
cql
# 超类调用父类方法
类 会说话的狗 继承 狗:
函数 叫(自身):
返回 超类().叫() + " 我还会说话!"
打印(会说话的狗().叫()) # 汪汪! 我还会说话!13.6属性访问与赋值
实例属性通过 自身.属性名 读写,也可以在实例化后直接从外部访问与赋值。下面的例子来自 README 的计数器示例:
cql
# 属性访问与赋值
类 计数器:
函数 __init__(自身, 起始 = 0):
自身.值 = 起始
函数 增加(自身, 步 = 1):
自身.值 += 步
返回 自身.值
计数 = 计数器(1)
打印("计数器:", 计数.增加(), 计数.增加(2)) # 计数器: 2 4
计数.值 = 100 # 外部直接给属性赋值
打印("设置后:", 计数.值) # 设置后: 100提示:
自身 与 超类 在 JavaScript 目标中会分别改写为 this 与 super,同一份源码可以同时运行在 Python 与浏览器 / Node.js 中。