python之面向对象的成员,方法,属性,异常处理
一、类的私有成员
1. 类中的私有成员是什么?
私有:只有满足一部分条件的才能使用
- 私有类的属性
- 私有对象的属性
- 私有方法
正常状态
class B:
school_name = '老男孩教育'
def __init__(self,name, sex, age):
self.name = name
self.sex = sex
self.age = age
class A(B): # A的父类是B,这个时候意味着A的实例化对象就可以使用B类中的所有属性或者方法
class_name = 'python23'
def func(self):
print(self.class_name)
print(self.name)
obj = A() # 实例化一个对象A
print(obj.class_name)
obj.func()# 通过实例化对象来执行A类中的方法
print(obj.school_name)
obj = A('alex', '男', 123)
obj.func() #调用A类中的func方法
print(obj.class_name) # 调用A类中的class_name
print(obj.school_name) # 调用B类中的school_name
私有成员有哪些
class A:
company_name = '老男孩教育' # 静态变量(静态字段)
__iphone = '1353333xxxx' # 私有静态变量(私有静态字段)
def __init__(self,name,age): #特殊方法
self.name = name #对象属性(普通字段)
self.__age = age # 私有对象属性(私有普通字段)
def func1(self): # 普通方法
pass
def __func(self): #私有方法
print(666)
@classmethod # 类方法
def class_func(cls):
""" 定义类方法,至少有一个cls参数 """
print('类方法')
@staticmethod #静态方法
def static_func():
""" 定义静态方法 ,无默认参数"""
print('静态方法')
@property # 属性
def prop(self):
pass
2. 设置类的私有静态属性(***)
格式
__girlnum = '1个'
- 对象在类的外部不能访问,类在外部也不能访问
- 只能在类的内部可以访问
内部访问方法:封装到方法内部,然后obj.func() #良心教育
类的私有成员有什么用?
如果想设定一些私有的或者是不想让类外面用到的,密码,加密方式等,设置成私有成员即可
例题
# 私有静态属性
class B:
school_name = 'OldBoy'
class A(B):
class_name = 'python23'
_girlnum = '1个' # 我就是私有属性
def func(self):
# print(self.class_name)
print(self.__girlnum)
obj = A() 实例化
print(obj.__girlnum) # 对象在类的外部不能访问,类在外部也不能访问print(A.__girlnum),这种就是私有属性
print(obj.func()) # 在类的内部可以访问
从类的外部调用
print(obj.calss_name)
从类的内容部调用
obj.func()
prin(obj.school_name) 对于类的共有静态属性,类的外部,累的内容部,派生类都可调用
3. 设置对象的私有属性
格式:
self.__age = age
# 定义方法,这就变成了私有成员了
obj.func()
调用方法
- 在类的外部是无法访问的
- 在类的内部可以使用
class B:
def __init__(self, name, age)
self.name = name
self.__age = age # 这就变成了私有成员了
def func(self):
print(self.__age)
print(obj.__age)#在类的外部是无法访问的
obj.func()# 在类的内部可以使用
#派生类
既想用子类也想用父类用super
子类打印父类属性,派生类中也不能访问
4. 私有成员的拓展
私有成员除了类的内部真的访问不到吗?
class A:
__girl_num = '1个'
print(A._dict_)
# 输出结果
'_A__girlnum'
print(A.__A_girlnum) # 这样是可以访问的,千万不要去访问
python中所有的私有成员,就是在私有成员前面加上__类名而已.所以是可以访问的
二、类的方法和静态方法
类方法 @classmethod用途
- 把一个对象绑定的方法修改成一个类方法
- 在方法中任然可以引用类中的静态变量
- 可以不用实例化对象,就直接用类名在外部调用这个方法
类方法怎么用?(***)
定义方法: @classmethod cls
调用方法: A.a_func() 通过用类名和对象名obj.a_func()调用
class A:
num = 1
def func(self):
print('实例方法')
# 以下就是类方法
@classmethod
def a_func(cls):
print(f'cls-->{cls}')
print('这就是类方法')
# 类方法的调用方法
obj = A()
A.func(obj) # self会得到obj这个对象
A.a_func()# 进行调用
类方法什么时候用?
- 定义一个方法,默认传self单这个self没有被使用
- 并且你在这个方法里用到了当前的类名,或者你准备使用这个类的内存空间中的名字的时候
- 就是你想在实例化之前修改一个类的属性,就可以用这个
例题:统计学生的个数
class Student:
count = 0
def __init__(self, name):
self.name = name
self.count1()
@classmethod
def count1(cls):
cls.count += 1
@classmethod
def print1(cls):
return cls.count
ly = Student('李烨')
sq = Student('扫强')
sq1 = Student('扫强')
sq2 = Student('扫强')
sq3 = Student('扫强')
sq4 = Student('扫强')
print(f'学生共计: {Student.print1()}个')
# 输出结果
学生共计: 6个
静态方法(***)
用途
不依赖于类,也不依赖于对象,他就是一个普通的函数放置于类中是结构更加清晰与合理.
怎么用?
定义一个静态方法:@staticmethod
调用一个静态方法:A.static_func()
例题
class A:
def func(self):
print(111)
@classmethod
def a_func(cls):
print(cls)
@staticmethod
def static_func(a,b,c): # 也可以传参,就当做一个函数用就行
print('静态方法')
A.static_func() # 类调用静态方法
obj = A()
obj.static_func(1,2,3)
为什么这种函数不写到类的外面?
也用不着类中的内容,但是为了划分,还是要放置于类中,显得与结构更加清晰与合理
切记在函数中要用return的方法返回值进行打印.
三、属性(伪装)
用途
将方法伪装成一个属性,这样看起来更合理
operty是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值
有问题的例题
class Bmi:
def __init__(self, hight, shoot):
self.hight = hight
self.shoot = shoot
def bmi(self):
BIM = self.shoot/self.hight**2
return BIM
obj = Bmi(1.75,67)
print(obj.bmi())
# 输出结果
21.877551020408163
属性怎么用?
伪装一个属性: @property
调用一个属性: obj.bmi 直接执行不用加括号,从执行方法看起来像一个属性,而看起来不是一个方法
将上段代码进行伪装,我们要让bmi伪装成一个属性
class Bmi:
def __init__(self, hight, shoot):
self.hight = hight
self.shoot = shoot
@property
def bmi(self):
BIM = self.shoot/self.hight**2
return BIM
obj = Bmi(1.75,67)
print(obj.bmi) #不用加括号了
# 输出结果
21.877551020408163
伪装属性有三种@property @aaa.setter @aaa.delter
1. 先伪装 obj.bmi()变成obj.bmi @property \n def aaa(self): \n print('get的时候执行我')
2. @aaa.setter --> def aaa(self,v): \n print('修改的时候执行我') --> obj.aa = '太白' # 结果: 太白 aaa三者必须是一致的
3. @aaa.delter --> def aaa(self): \n print('删除的时候执行我') del Bmi.bmi
注意事项:
- 设置属性,你的对象属性一定不能出现同名的属性
- setter,deleter这两个装饰器装饰的函数不能使用return
函数与面向对象的区别
四、isinstance/issubclass/type
isinstance(a,b): 判断a是由b类(b的派生类)实例化的对象.
判断的是类与对象的关系
class A:
pass
class B(A):
pass
obj = B()
print(isinstance(obj,B))
print(isinstance(obj,A))
# 输出结果
True
True
issubclass(M,N)判断M类是N类的子孙
class A:
pass
class B(A):
pass
class C(B):
print(isinstance(C,B))
print(isinstance(C,A))
# 输出结果
True
True
type是什么?
type 是一个原类, 用来判断一个数据类型是由哪个类实例化的对象,python中一切皆对象,一个类也是一个对象,那么这个类对象肯定是由类实例化出来的.
python中你创建的所有类,以及大部分list str 等等这些类都是从type原类实例化得来的
python中继承object类都是新式类.
object也是由type原类实例化得来的
五、异常处理
什么叫异常
你的程序出现中断,飘红,致使你的整个项目中断了.
错误类型
语法错误
自己去避免,就不应该出现在你的代码中
逻辑错误
l1 = [1,2,3]
print(l1[4]) #超过了取值范围
异常错误处理
- 用if进行异常处理:缺点,嵌套太多,太复杂,只能进行简单的异常处理
- 用try简单尝试一下
try(***)
从上到下捕捉错误信息,然后进行引流,也有分流的作用
单分支错误就是设置一个except和多分支就是设置多个except
及时解决异常,避免程序中断
status_dic = {
1: 111,
2: 333,
3: 444,
}
while 1:
try:
num = input('请输入序号')
int(num)
print(status_dic[int(num)])
except KeyError as e:
print('选项超出范围,重新输入')
except ValueError as e:
print('请输入数字')
万能异常
status_dic = {
1: 111,
2: 333,
3: 444,
}
while 1:
try:
num = input('请输入序号')
int(num)
print(status_dic[int(num)])
except Exception as e:
print(e)
print(111)
什么时候用万能异常,什么时候用多分支?
- 如果你只是想把这个异常处理掉,让程序继续执行,这个时候用万能异常
- 如果出现了异常,你是想根据不同的异常执行不同的逻辑流程,你要采取多分支
万能+多分支
status_dic = {
1: 111,
2: 333,
3: 444,
}
while 1:
try:
num = input('请输入序号')
int(num)
print(status_dic[int(num)])
except KeyError as e:
print('选项超出范围,重新输入')
except ValueError as e:
print('请输入数字')
except Exception:
pass
异常处理的其他成员
status_dic = {
1: 111,
2: 333,
3: 444,
}
while 1:
try:
num = input('请输入序号')
int(num)
print(status_dic[int(num)])
except KeyError as e:
print('选项超出范围,重新输入')
except Exception:
pass
# else
status_dic = {
1: 111,
2: 333,
3: 444,
}
while 1:
try:
num = input('请输入序号')
int(num)
print(status_dic[int(num)])
except KeyError as e:
print('选项超出范围,重新输入')
except Exception:
pass
else: # 不出现异常执行,如果出现异常就不执行
print(666)
# finally
status_dic = {
1: 111,
2: 333,
3: 444,
}
while 1:
try:
num = input('请输入序号')
int(num)
print(status_dic[int(num)])
except KeyError as e:
print('选项超出范围,重新输入')
except Exception:
pass
finally: # 在异常发生之前执行finally
print('执行finally')
使用场景:
- 文件操作
目的是在报错之前,关闭文件句柄
方法:
try:
xxx
xxx
finally:
print('哈哈哈哈')
f.close()
f = open('register', mode='w')
f.write('fdjsaklfd')
f.write('fdjsaklfd')
f.write('fdjsaklfd')
l1 = [1,2,3]
print(l1[1000])
f.write('fdjsaklffjdsklaf')
f.close()
try:
f = open('register', mode='w')
f.write('fdjsaklfd')
f.write('fdjsaklfd')
f.write('fdjsaklfd')
l1 = [1, 2, 3]
print(111)
print(l1[1000])
f.write('fdjsaklffjdsklaf')
finally:
print('哈哈哈哈')
f.close()
- 连接数据库引擎
在函数中的finally
def func():
try:
a = 1
b = 2
return a + b
finally:
print(666)
func()
主动抛出异常
Raise Exception('sdfasdf')
断言
assert 条件 # 源码上assert.
assert 1 == 2
print(11)
print(22)
print(33)
自定义异常
TypeError
class Connection(BaseException):
def __init__(self,msg):
self.msg = msg
raise Connection('触发了连接异常')
# 异常处理总结:
# 异常处理不能经常使用:异常处理耗费性能.有些错误是需要进行分流使用.代码的可读性变差.
# 关键节点使用.
python之面向对象的成员,方法,属性,异常处理的更多相关文章
- 全面了解python中的类,对象,方法,属性
全面了解python中的类,对象,方法,属性 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...
- python面向对象的成员、属性等
#类成员: #字段 self.xy =qq . xy=qq #普通字段 (保存在对象里面) #直接通过点(.)+ 字段 进行调用 #静态字段 (保存在类里面) #静态字段属于类,在内存只保留一份 . ...
- NO.7:自学python之路------类的方法、异常处理、socket网络编程
引言 我visual studio 2017就算体积巨大.启动巨慢.功能简陋也不会安装PyCharm的,嘿呀,真香.好吧,为了实现socket网络编程,更换了软件. 正文 静态方法 只是在名义上归类管 ...
- python程序设计——面向对象程序设计:方法
类中定义的方法分为四类:公有方法,私有方法,静态方法,类方法 公有方法.私有方法都属于对象,私有方法的名字以"__"开始 每个对象都有自己的公有方法和私有方法,这两类方法可以访问属 ...
- python之面向对象函数与方法,反射,双下方法
一.函数和方法 1.函数和方法的区别 函数: 全都是显性传参,手动传参,与对象无关 方法: 存在隐性传参,与对象有关 1.1通过函数名可以判断 len()就是函数 str.count()就是方法 de ...
- Python 进阶 - 面向对象
Python 面向对象 面向过程 把完成某个需求的所有步骤,从头到尾逐步实现 根据开发需求,将某些功能独立的代码封装成一个又一个函数 最后完成的代码,就是顺序地调用不同的函数 面向过程特点: 注重步骤 ...
- python_way,day8 面向对象【多态、成员--字段 方法 属性、成员修饰符、特殊成员、异常处理、设计模式之单例模式、模块:isinstance、issubclass】
python_way day8 一.面向对象三大特性: 多态 二.面向对象中的成员 字段.方法属性 三.成员修饰符 四.特殊成员 __init__.__doc__.__call__.__setitem ...
- python 面向对象、特殊方法与多范式、对象的属性及与其他语言的差异
1.python 面向对象 文章内容摘自:http://www.cnblogs.com/vamei/archive/2012/06/02/2532018.html 1.__init__() 创建对 ...
- Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type())
Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type()) 一丶类的结构细分 ...
随机推荐
- Reids(4)——神奇的HyperLoglog解决统计问题
一.HyperLogLog 简介 HyperLogLog 是最早由 Flajolet 及其同事在 2007 年提出的一种 估算基数的近似最优算法.但跟原版论文不同的是,好像很多书包括 Redis 作者 ...
- Python:turtle库的使用及图形绘制
目录 一.绘制一个八边形 二.绘制一个八角图形 三.简述问题 四.循环程序设计 五.绘制一个自己喜欢的图形 一.绘制一个八边形 使用turtle库,绘制一个八边形 代码: from turtle im ...
- LeetCode python实现题解(持续更新)
目录 LeetCode Python实现算法简介 0001 两数之和 0002 两数相加 0003 无重复字符的最长子串 0004 寻找两个有序数组的中位数 0005 最长回文子串 0006 Z字型变 ...
- mysql 存储过程 执行存储过程修改了表中所有行的信息
存储过程中的where条件语句,如果传入的参数和表字段名相同,存储过程就会把这个约束条件忽略.小结:存储过程中传递的参数名不要和字段名相同.特别是修改.删除等操作,可能会对整张表产生影响.后果会很严重 ...
- Ado.net 02
1.连接字符串不同,连接池也不同 SqlConnection对象只能被打开一次.但是在Close()后再进行Open()操作.但是在Dispose()之后就不能再Open()了. 2.SqlDataA ...
- Java基础--方法的定义
1.为什么要有方法? 方法(又叫函数)就是一段特定功能的代码块.方法提高程序的复用性和可读性. 比如,有了方法,我们可以把要重复使用的一段代码提炼出来,然后在每个需要执行这段代码的地方去调用即可. 2 ...
- JZOJ 3453.【NOIP2013中秋节模拟】连通块(connect)
3453.[NOIP2013中秋节模拟]连通块(connect) Time Limits: 1000 ms Memory Limits: 262144 KB (File IO): input:conn ...
- 单片机基础——使用GPIO输出点亮一个LED灯
1. 准备工作 硬件准备 开发板首先需要准备一个小熊派IoT开发板,并通过USB线与电脑连接. 软件准备 需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码,可参考MDK安装教程 ...
- SQLi-Labs之1~6关 - 常规注入与盲注
年初五 财神入 第一关 联合注入 1.准备 2.加'截断 3.order by 判断查询列数 4.同上 5.联合查询判断字段位置 6.查数据库名 7.1 查表名 7.2 查列名 8.查数据 第二关 不 ...
- Echart饼形图和折线图的循环展示及选择展示
需求:根据不同的入参调同一接口,循环展示一组饼形图或折线图: 主要问题:在于给定的数据格式不符合图表的配置项格式,需要拆分组装数据:首先默认展示几个图表,当选中一个类别,需要展示其中一个的时候,页面中 ...