本文整理自下面这个视频:
Object Oriented Programming (OOP) In Python - Beginner Crash Course author:Python Engineer (Youtube)
谈到OOP,就不得不谈继承、多态和封装。 继承实现了代码重用,并且是多态的基础; 多态提高了代码的灵活性、扩展性; 封装隐藏内部细节,更好地保护数据。 抽象是OOP的基础,有好的抽象能力才能设计出好的基类,好的函数层级...... (by 一只大鸽子)
WHY?
为什么我们需要Class? 如果你的需求很简单,基本数据类型就可以满足,那么不需要Class。 但是随着需求变得复杂,你会发现有非常多的数据和函数需要管理。这个时候就需要用Class了。 举例: 你要写一个管理雇员信息的程序,现在正在写管理"软件工程师"人员的代码。 一个软件工程师有这些信息:职位、姓名、年龄、等级、工资。 你可以用列表来存储,或者用 namedtuple
来存储信息。没问题,代码可以跑通。但是后面进行操作的时候,就会比较混乱。
因此,我们用类实现"软件工程师": 在 __init__
中初始化他的信息(属性)。
class SoftwareEngineer:
def __init__(self, name, age, level, salary):
self.name = name
self.age = age
self.level = level
self.salary = salary
if __name__ == '__main__':
se1 = SoftwareEngineer('DD',20,'Senior', 7000)
class attributes & instance attributes
刚刚在 __init__
中的属性是 instance attributes
, 和每一个具体的软件工程师相关(如名字,每个软件工程师都有自己的名字),而 class attributes
是和类相关,不依赖具体的人(如他们的中文名称都是"软件工程师")。一般在class 中定义(而不在 __init__
函数内)。
class SoftwareEngineer:
# class attributes
alias = "Keyboard Magician" # 别名
cn_name = "软件工程师"
# instance attributes
def __init__(self, name, age, level, salary):
self.name = name
self.age = age
self.level = level
self.salary = salary
if __name__ == '__main__':
se1 = SoftwareEngineer('DD', 20, 'Senior', 7000)
print(se1.cn_name)
print(SoftwareEngineer.cn_name)
现在我们要让软件工程师写代码了。 我们定义一个函数 code()
,让某个工程师写代码:
def code(self):
print(f"{self.name} is writing code...")
如果想让他用某个语言写代码,可以给函数加一个 language
参数:
def code_in_language(self,language):
print(f"{self.name} is writing code...in {language}")
dunder method
带有双下划线的方法,是Python中的一种特殊方法,也称为魔法方法,会被隐式地自动调用。 例如 __init__
方法,我们不用手动调用,而是创建对象时自动调用。 se1 = SoftwareEngineer('DD', 20, 'Senior', 7000)
类中常用的一个dunder method 是 __str__
,用来返回实例信息。
# dunder method
def __str__(self):
information = f"name = {self.name}, age={self.age}, level={self.level}"
return information
__str__
方法返回一个包含实例信息的字符串,在print(实例)时会自动调用。 print(se1)
__eq__(self, other)
:比较两个对象相等时自动调用,该函数应该返回一个布尔类型值
类中的静态方法
使用 @staticmethod
修饰。属于类但不属于某个具体的实例(没有self参数)。
@staticmethod
def entry_salary(age):
if age > 25 :
return 7000
else:
return 5000
继承(inherits)、扩展(extend)、重写(override)
继承(inherits)
ChildClass(BaseClass)
继承一个类,意味着继承类的属性和方法。
class Employee:
def __init__(self, name, age, salary):
self.name = name
self.age = age
self.salary = salary
def work(self):
print(f"f{self.name} is working...")
class SoftwareEngineer(Employee):
pass
class Desiner(Employee):
pass
if __name__ == '__main__':
se = SoftwareEngineer("DD",25,5000, "Junior")
print(se.name)
扩展(extend)
新增方法。例如可以在SoftwareEngineer中新增debug方法。
class SoftwareEngineer(Employee):
#override
def __init__(self,name, age, salary, level):
super().__init__(name,age,salary)
self.level = level
# extend
def debug(self):
print(f"{self.name} is debugging...")
重写(override)
和父类方法 同名时会覆盖掉父类方法, 注意:初始化方法 __init__
重写时必须调用父类的初始化方法 super().__init__
。 否则会出现意想不到的错误(找不到属性等问题)。
class Employee:
def __init__(self, name, age, salary):
self.name = name
self.age = age
self.salary = salary
def work(self):
print(f"{self.name} is working...")
class SoftwareEngineer(Employee):
#override
def __init__(self,name, age, salary, level):
super().__init__(name,age,salary)
self.level = level
# extend
def debug(self):
print(f"{self.name} is debugging...")
# override
def work(self):
print(f"{self.name} is coding...")
class Desiner(Employee):
# override
def work(self):
print(f"{self.name} is designing...")
多态(Polymorphism)
调用同一方法,根据具体的类表现出不同的行为。
se = SoftwareEngineer("DD",25,5000, "Junior")
de = Desiner("xd",25,5000)
employes = [se,de]
for employe in employes:
employe.work()
_salary
以单下划线开头的变量或函数(习惯上地、并非语法规定地) 约定为私有变量,不该在外部直接访问或修改。 而应该通过getter和setter方法进行访问和修改。 __xx
以双下划线开头的变量会被重命名为 _ClassName__xx
,避免意外访问。 虽然有这些约定,但是实际上Python没有实现真的私有变量。外部还是可以访问所有变量。
@property
修饰getter方法, 并且可以通过该函数名x获取属性x。函数名和属性名是一样的。 @x.setter
修饰setter方法,并且修改属性x时会自动调用该方法。 @x.deleter
修饰del 方法, 删除属性x时会自动调用,用的很少。
class SoftwareEngineer():
#override
def __init__(self,name, age, salary,level):
self.name = name
self.age = age
self._salary = salary
self.level = level
@property
def salary(self):
return self._salary
@salary.setter
def salary(self, value):
self._salary = value
@salary.deleter
def salary(self):
del self._salary
if __name__ == '__main__':
se1 = SoftwareEngineer('DD',25,5000,'Junior')
print(se1.salary)
se1.salary = 7000
print(se1.salary)
Original: https://blog.51cto.com/pigeon/5484082
Author: 一只大鸽子
Title: Python-OOP 快速入门
相关阅读1
Title: 如何使用PyQt5一步步实现用户登录GUI界面、登录后跳转?
PyQt5是强大的GUI工具之一,通过其可以实现优秀的桌面应用程序。希望通过一个简单的登录页面可以让大家顺利入坑,如有不妥之处还请大佬指点改正!
导入业务需要的所有的扩展包。
import sys # 系统参数操作
from PyQt5.QtWidgets import * # 模块包含创造经典桌面风格的用户界面提供了一套UI元素的类
from PyQt5.QtCore import * # 此模块用于处理时间、文件和目录、各种数据类型、流、URL、MIME类型、线程或进程
from PyQt5.QtGui import * # 含类窗口系统集成、事件处理、二维图形、基本成像、字体和文本
创建主界面窗口。
class MainWindow(QMainWindow):
def __init__(self, *args, **kwargs):
'''
构造函数,初始化参数属性
:param args:
:param kwargs:
'''
super().__init__(*args, **kwargs)
self.setWindowTitle('主功能页面')
self.setFixedWidth(600)
self.setFixedHeight(600)
创建登录对话框。
class LoginDialog(QDialog):
def __init__(self, *args, **kwargs):
'''
构造函数,初始化登录对话框的内容
:param args:
:param kwargs:
'''
super().__init__(*args, **kwargs)
self.setWindowTitle('欢迎登录') # 设置标题
self.resize(200, 200) # 设置宽、高
self.setFixedSize(self.width(), self.height())
self.setWindowFlags(Qt.WindowCloseButtonHint) # 设置隐藏关闭X的按钮
'''
定义界面控件设置
'''
self.frame = QFrame(self) # 初始化 Frame对象
self.verticalLayout = QVBoxLayout(self.frame) # 设置横向布局
self.verticalLayout
self.login_id = QLineEdit() # 定义用户名输入框
self.login_id.setPlaceholderText("请输入登录账号") # 设置默认显示的提示语
self.verticalLayout.addWidget(self.login_id) # 将该登录账户设置添加到页面控件
self.passwd = QLineEdit() # 定义密码输入框
self.passwd.setPlaceholderText("请输入登录密码") # 设置默认显示的提示语
self.verticalLayout.addWidget(self.passwd) # 将该登录密码设置添加到页面控件
self.button_enter = QPushButton() # 定义登录按钮
self.button_enter.setText("登录") # 按钮显示值为登录
self.verticalLayout.addWidget(self.button_enter) # 将按钮添加到页面控件
self.button_quit = QPushButton() # 定义返回按钮
self.button_quit.setText("返回") # 按钮显示值为返回
self.verticalLayout.addWidget(self.button_quit) # 将按钮添加到页面控件
# 绑定按钮事件
self.button_enter.clicked.connect(self.button_enter_verify)
self.button_quit.clicked.connect(
QCoreApplication.instance().quit) # 返回按钮绑定到退出
def button_enter_verify(self):
# 校验账号是否正确
if self.login_id.text() != "admin":
print("test1")
return
# 校验密码是否正确
if self.passwd.text() != "admin@1234":
print("test2")
return
# 验证通过,设置QDialog对象状态为允许
self.accept()
最后通过mian入口函数启动应用。
if __name__ == "__main__":
# 创建应用
window_application = QApplication(sys.argv)
# 设置登录窗口
login_ui = LoginDialog()
# 校验是否验证通过
if login_ui.exec_() == QDialog.Accepted:
# 初始化主功能窗口
main_window = MainWindow()
# 展示窗口
main_window.show()
# 设置应用退出
sys.exit(window_application.exec_())
【往期精彩】
● 办公自动化:几行代码将PDF文档转换为WORD文档(代码实战)!
● 办公自动化:轻松提取PDF页面数据,并生成Excel文件(代码实战)!
● sched 模块中巨好用的轻量级定时任务神器scheduler!
● 不用再使用命令行打包成exe,有人写出了UI应用,可视化UI界面对python程序进行打包的方法!
● 发现一个秘密:既python3.6之后字典竟然变成了有序集合,我再次验证了一下!
● 这么多的内置函数能记住吗?对python的68个内置函数分类总结!
● 当大厂码农,遇到多年未见的公务员老同学,故事的结尾炸了...
● 必须要会的文件操作对象File,python文件读写操作利器!
● 你不知道的CS模式的进程管理工具,状态监测、项目启停一目了然!
● 如何将一个python应用以docker镜像的方式来运行?
● python-celery专注于实现分布式异步任务处理、任务调度的插件!
● python远程服务操作工具:fabric,远程命令、本地命令、服务器操作利器!
● python超赞插件you-get,执行一行命令即可下载、命令行下载工具推荐!
● 办公自动化:Python-win32com自动将word文档转换成pdf格式!
Original: https://www.cnblogs.com/lwsbc/p/15525984.html
Author: Python集中营
Title: 如何使用PyQt5一步步实现用户登录GUI界面、登录后跳转?
相关阅读2
Title: 女朋友让我深夜十二点催她睡觉,我有Python我就不干
事情是这样的:今天晚上,女朋友让我十二点催她睡觉。
不过,可是我实在太困了,熬不下去...... 是吧?女朋友哪有睡觉重要?
但,女朋友的命令,我是不敢违抗的......
但是睡觉也不能缺!
这时候我们该怎么办呢?是时候让Python登场了!
Python登场
这次我们来做一个自动发送微信的程序,在深夜十二点的时候给女朋友发去消息,也算是尽了一个男朋友的义务了。
安装和导入
我们需要两个模块: apscheduler, pyautogui
快捷键 Windows+r 打开运行控制框,输入 cmd,进入命令行,输入:
pip install apscheduler
pip install pyautogui
导入:
import pyautogui
from datetime import datetime
from apscheduler.schedulers.blocking import BlockingScheduler # 阻塞当前进程的调度器
# blocking类型调度器会阻塞当前进程,若你想要后台运行的调度器,可以使用以下代码:
# from apscheduler.schedulers.background import BackgroundScheduler
pyautogui
首先我们来实现自动发送消息
pyautogui 是一个非常强大的库,可以操作鼠标和键盘。我们将用它来完成自动操作电脑。
先来做一些基本设置:
pyautogui.PAUSE = 1 # 设置每一步操作的间隔(秒),可防止操作太快
然后我们登录微信,最小化。
接下来我们把鼠标放到微信的任务栏图标上,运行以下语句,获取此时光标的坐标,返回一个Point对象:
print(pyautogui.position()) # 打印坐标,Point(x=148, y=879)
icon_position = pyautogui.position() # Point(x=148, y=879)
打开微信,选择女朋友的回话窗口,将鼠标放在输入框上,同样获取光标坐标,为了将焦点锁定到输入框以方便待会的输入。
print(pyautogui.position()) # 打印坐标,Point(x=174, y=751)
entry_position = pyautogui.position() # Point(x=174, y=751)
接下来,控制程序依次点击这两个点:
pyautogui.click(icon_position) # 默认左键单击
# pyautogui.click(148, 879)
pyautogui.click(entry_position)
# pyautogui.click(174, 751)
打开微信并锁定焦点后,我们开始输入文本。
输入文本可以有两种方式:
pyautogui.typewrite(['o', 'n', 'e', 'enter'])
在方法中传入一个列表,里面每一元素都是单个字母或特殊按键pyautogui.typewrite('You can type multiple letters in this way')
传入字符串,但不能同时打印字母和特殊按键。
这两种方式都不能直接输入中文,所以只能依靠你的输入法来输入中文了。
pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第一个参数是输入文本,第二个是输入每个字符的间隔时间
为了使我们的操作更加 人模狗样 像人的操作,我么来加上移动鼠标的代码:
pyautogui.moveTo(icon_position, duration=2) # duration为执行时长,可选
pyautogui.click(icon_position)
pyautogui.moveTo(entry_position, duration=2)
pyautogui.click(entry_position)
pyautogui.typewrite([*list('zhengzai '), *list('jinxing '), 'shift', *list('pyautogui'), 'shift', *list('shiyan '), 'enter'], 0.1) # 第二个参数为按下每一个字母的间隔,可选
看看效果:
当然,若是你要输入的内容实在很多,又嫌麻烦,可以通过复制粘贴来实现:
import pyperclip
pyperclip.copy('正在进行发中文试验,看到请忽略,更不要骂傻逼') # 复制
pyautogui.hotkey('ctrl', 'v') # 按下组合键的方法,ctrl+v粘贴
pyautogui.press('enter') # 按下按键
这样,我们便完成了自动发送微信消息的功能了。
apscheduler
APScheduler 是一个Python库,可实现延迟调度要执行Python代码的功能,可以只执行一次,也可以定期执行。可以随时添加新任务或删除旧任务。能够十分方便地进行定时任务。
scheduler = BlockingScheduler() # 实例化一个调度器
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
scheduler.start()
add_job 方法在这里传了 3 个参数,第一个为到时间后要执行的函数,第二个为触发器的类型。这里选用的是 date 触发器,特定的时间点触发,作业任务只会执行一次。第三个参数 run_date 就是执行的时间。在这前我已经把自动发送消息的代码封装为了 main 函数,只需到时后调用即可。
完整代码
import pyautogui
import pyperclip
from datetime import datetime
from apscheduler.schedulers.blocking import BlockingScheduler
def main():
pyautogui.PAUSE = 0
icon_position = pyautogui.Point(x=148, y=879) # 任务栏图标位置
entry_position = pyautogui.Point(x=174, y=751) # 输入框位置
pyautogui.moveTo(icon_position, duration=1) # duration为执行时长,可选
pyautogui.click(icon_position)
pyautogui.moveTo(entry_position, duration=0.7)
pyautogui.click(entry_position)
pyperclip.copy('快去睡觉')
pyautogui.hotkey('ctrl', 'v')
pyautogui.press('enter')
pyperclip.copy('笨猪')
pyautogui.hotkey('ctrl', 'v')
pyautogui.press('enter')
scheduler = BlockingScheduler() # 实例化
scheduler.add_job(main, 'date', run_date=datetime(2021, 8, 18, 24, 00, 00)) # 添加任务
scheduler.start()
完成啦!现在可以去睡觉了。
结果
第二天早上起床,我被我妈妈骂了一顿,问我为什么午夜12点的时候电脑还亮着,而且还在自己发微信!
不过,好在女朋友没丢,我成功完成了女朋友的任务!
-- the End --
好啦,这篇文章就到这里了。以上就是我分享的全部内容,感谢阅读!
打个小广告:作者CSDN博客主页:
https://blog.csdn.net/weixin_52132159
Original: https://www.cnblogs.com/hi-zzh/p/15885766.html
Author: 你豪哥哥
Title: 女朋友让我深夜十二点催她睡觉,我有Python我就不干
相关阅读3
Title: python中的定义类方法有三种形式
- 普通方法
- 类方法(@classmethod)
- 静态方法(@staticmethod)
创建普通的方法的方式有两种(class A() & class B()).
class A():
def __init__(self, name, age):
self.name = name
self.age = age
def get_name(self):
print('my name is', self.name)
def get_age(self):
print(f'i am {self.age} years old')
class B():
def get_name(self, name):
print('my name is', name)
def get_age(self, age):
print(f'i am {age} years old')
if __name__ == '__main__':
a = A('tom',19)
a.get_name() # my name is tom
a.get_age() # i am 19 years old
b = B()
b.get_name('tom') # my name is tom
b.get_age(19) # i am 19 years old
每次调用方法之前需要对类进行实例化
@classmethod不需要self来表示自身了,而是用了cls来代替。
此时不用再进行实例化了。直接 类名.函数名 进行调用。
#Python学习交流群:725638078
class C():
@classmethod
def get_name(cls, name):
print(cls) #
print('my name is %s' % name)
@classmethod
def get_age(cls, age):
print(f'i am %s years old' % age)
if __name__ == '__main__':
C.get_name('tom') # my name is tom
C.get_age(19) # i am 19 years old
@staticmethod也是通过 类名.函数名 的方式进行调用
静态方法不需要表示自身对象的self或者cls作为参数,跟直接使用函数是一样的。
class D():
@staticmethod
def get_name(name):
print('my name is %s' % name)
@staticmethod
def get_age(age):
print(f'i am %s years old' % age)
if __name__ == '__main__':
D.get_name('tom') # my name is tom
D.get_age(19) # i am 19 years old
@staticmethod 与 @classmethod在Python中称为 装饰器,
用来修饰函数,相当于添加一个额外的功能,比如不再像普通函数那样进行实例化。
通过使用装饰器可以让代码更加整洁,易读。用了修饰器之后,也可以进行实例化之后再调用,但是就显得多此一举了。
Original: https://www.cnblogs.com/python1111/p/15593643.html
Author: 小小程序员ol
Title: python中的定义类方法有三种形式