python面向对象相关
实现
-
定义类,在类中定义方法,在方法中去实现具体的功能。
-
实例化类并的个一个对象,通过对象去调用并执行方法。
-
注意:
-
类名称首字母大写&驼峰式命名
-
.py3之后默认类都继承object
-
在类中编写的函数称为方法
-
每个方法的第一个参数是self
-
对象和self
-
__init__方法
每个类中都可以定义一个__init__
初始化的方法,在类被实例化的时候自动执行次方法
在实例化类时,会将类后面的括号中的参数传给__init__
-
对象:在类中封装一些数据,在需要使用的时候可以调用
-
self:对象当作参数传给self,在调用类中的方法可以获取对象的值
常见成员
-
实例变量:属于对象,只通过对象调用
-
类变量: 属于类。可以被所有的对象共用,类似全局变量
-
绑定方法:属于类,类和对象都可以调用 默认有一个self参数
-
类方法:属于类,类和对象都可以调用 默认有一个cls参数, @classmethod
-
静态方法 属于类, 类和对象都可以调用,无默认参数,@staticmethod
类的方法都可以被对象和类调用;c#中绑定方法只能对象调用,类方法和静态方法只能类调用
分页实例
class Pagination:
# __init__ 的参数是用户输入的页码,和默认的每页的元素为10
def __init__(self, current_page, per_page_num=10):
self.per_page_num = per_page_num
# 判断输入的时否是整数 如果不是则将输入的值赋值1
if not current_page.isdecimal():
self.current_page = 1
return
current_page = int(current_page)
# 判断输入的时否是小于1 如果不是则将输入的值赋值1
if current_page < 1:
self.current_page = 1
return
self.current_page = current_page
def start(self):
return (self.current_page - 1) * self.per_page_num
def end(self):
return self.current_page * self.per_page_num
user_list = ["用户-{}".format(i) for i in range(1, 3000)]
# 分页显示,每页显示10条
while True:
page = input("请输入页码:")
# page,当前访问的页码
# 10,每页显示10条数据
# 内部执行Pagination类的init方法。
pg_object = Pagination(page, 20)
page_data_list = user_list[pg_object.start(): pg_object.end()]
for item in page_data_list:
print(item)
-
属性 由绑定方法 + 特殊装饰器 组合创造出来的,让我们以后在调用方法时可以不加括号 @property
关于属性的编写有两种方式:
-
方式一,基于装饰器
class C(object): @property def x(self): pass @x.setter def x(self, value): pass @x.deleter def x(self): pass obj = C() obj.x obj.x = 123 del obj.x
-
方式二,基于定义变量
class C(object): def getx(self): pass def setx(self, value): pass def delx(self): pass x = property(getx, setx, delx, "I'm the 'x' property.") obj = C() obj.x obj.x = 123 del obj.x
-
属性名称 不要 与实例变量 重名
三大特性
封装
-
将同类数据放在同一个类中
-
可以封装在
__init__
中,类中的方法可以使用
继承
子类可以使用父类中的方法和类变量
继承方式:class Son(father)
class Base:
def func(self):
print("Base.func")
class Son(Base):
def show(self):
print("Son.show")
s1 = Son()
s1.show()
s1.func() # 优先在自己的类中找,自己没有才去父类。
s2 = Base()
s2.func()
执行方法时,首先在对象关联的类中找方法,子类没有才去父类中查找
多继承时,先左后右
self对应的是谁,先去self对于的类中去找成员,再去父类中找
多态
鸭子类型(duck typing)
多种形态: 如下可以传入不同类型的参数
def func(arg):
v1 = arg.copy() # 浅拷贝
print(v1)
func("武沛齐")
func([11,22,33,44])
数据类型
# 实例化一个str类的对象v1
v1 = str("武沛齐")
# 通过对象执行str类中的upper方法。
data = v1.upper()
print(data)
变量在转换和声明时就是实例化了一个对象,然后调用类中的方法
成员修饰符
-
公有:在任何地方都可以调用这个成员。
-
私有:只有在类的内部才可以调用改成员(成员是以两个下划线开头,则表示该成员为私有)。
-
父类中的私有成员,子类无法继承。
对象嵌套
特殊成员
-
__init__
初始化方法 -
__new__
构造方法 -
__call__
执行方法 -
__str__
返回字符串 -
__dict__
构建字典的方法 -
__getitem__
、__setitem__
、__delitem__
字典的取值和设置值 删除值的方法 -
__enter__
、__exit__
上下文管理 -
__add__
-
__iter__
迭代器方法1.当类中定义了 __iter__ 和 __next__ 两个方法。 2.__iter__ 方法需要返回对象本身,即:self 3. __next__ 方法,返回下一个数据,如果没有数据了,则需要抛出一个StopIteration的异常。
内置函数
-
callable,是否可在后面加括号执行。
变量名加()可以是函数,类,具有call方法的对象
-
super,按照mro继承关系向上找成员。
当原来的类中需要增加功能又不改变原来类的时候可以在子类中用super().父类中的方法调用父类的方法
-
type,获取一个对象的类型。
-
isinstance,判断对象是否是某个类或其子类的实例。
-
issubclass,判断类是否是某个类的子孙类。
异常处理
-
异常基本格式
try:
# 逻辑代码
except Exception as e:
# try中的代码如果有异常,则此代码块中的代码会执行。
finally:
# try中的代码无论是否报错,finally中的代码都会执行,一般用于释放资源。
"""
try:
file_object = open("xxx.log")
# ...
except Exception as e:
# 异常处理
finally:
file_object.close() # try中没异常,最后执行finally关闭文件;try有异常,执行except中的逻辑,最后再执行finally关闭文件。
"""
-
常见异常
AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError 输入/输出异常;基本上是无法打开文件
ImportError 无法引入模块或包;基本上是路径问题或名称错误
IndentationError 语法错误(的子类) ;代码没有正确对齐
IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError 试图访问字典里不存在的键
KeyboardInterrupt Ctrl+C被按下
NameError 使用一个还未被赋予对象的变量
SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError 传入对象类型与要求的不符合
UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
导致你以为正在访问它
ValueError 传入一个调用者不期望的值,即使值的类型是正确的
-
自定义异常&抛出异常
使用:
raise MyException()
类实现触发自定义的异常class MyException(Exception): pass try: raise MyException() except MyException as e: print("MyException异常被触发了", e) except Exception as e: print("Exception", e)
-
特殊的finally
在try或except中即使定义了return,也会执行最后的finally块中的代码。
def func(): try: return 123 except Exception as e: pass finally: print(666) func()
本文来自博客园,作者:wq512,转载请注明原文链接:https://www.cnblogs.com/wangqi512/p/15187450.html