2020-12-28

博客探讨了虚方法的使用情况及与接口的差异。指出子类重新定义父类方法时,父类方法需定义为 virtual;定义接口不能有方法体,虚方法可以,子类可不重新定义虚方法,但继承接口则必须实现。
  1. 您在什么情况下会用到虚方法?它与接口有什么不同?
    a. 子类重新定义父类的某一个方法时,必须把父类的方法定义为 virtual
    b. 在定义接口中不能有方法体,虚方法可以。实现时,子类可以不重新定义虚方法,但如果一个类继承接口,那必须实现这个接口。
以下是一个满足你需求的 Python 程序,它会循环每 2 秒向日志文件 `my.log` 写入一行日志,格式为序号加时间,并且每次写入的内容会立即显示在终端上。即使程序被强行结束,再次运行时序号会从上次结束的地方继续: ```python import time import os LOG_FILE = "my.log" COUNT_FILE = "counter.dat" # 读取或初始化计数器 if os.path.exists(COUNT_FILE): with open(COUNT_FILE, "r") as f: line_count = int(f.read().strip()) else: line_count = 0 try: while True: current_time = time.ctime() log_line = f"{line_count + 1}. {current_time}\n" # 写入日志文件 with open(LOG_FILE, "a") as f: f.write(log_line) f.flush() # 确保内容立即写入磁盘 os.fsync(f.fileno()) # 确保写入完成 # 打印到终端 print(log_line.strip()) # 更新计数器 line_count += 1 with open(COUNT_FILE, "w") as f: f.write(str(line_count)) time.sleep(2) except KeyboardInterrupt: print("\n日志写入程序已终止。") ``` ### 代码解释: 1. **`LOG_FILE`**:定义日志文件名 `my.log`。 2. **`COUNT_FILE`**:定义一个计数器保存文件,用于记录已经写入了多少行。 3. **读取计数器**: - 如果 `counter.dat` 文件存在,就读取其中的数字作为当前行号; - 否则从 0 开始。 4. **循环写入日志**: - 每次循环生成一行日志,格式为 `序号. 时间`; - 使用 `with open(..., "a")` 以追加模式写入文件; - 使用 `f.flush()` 和 `os.fsync()` 确保写入内容立即刷新到磁盘; - 打印到终端; - 更新计数器并保存到 `counter.dat`; - 每次写入后 `line_count` 增加 1。 5. **异常处理**: - 使用 `try-except` 捕获 `KeyboardInterrupt`(Ctrl+C)以优雅退出。 --- ### 注意事项: - `counter.dat` 文件用于持久化保存行号,确保程序重启后序号连续。 - `my.log` 文件会不断追加内容,不会覆盖旧内容。 - 若你使用的是 Linux/macOS,可以使用 `tail -f my.log` 实时查看日志内容。 --- ### 相关问题:
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值