实例方法、类方法、静态方法
class CObj(object):
# 一个类属性
class_number = 10
# 实例方法必须使用实例调用,第一个参数是一个
# 指向当前对象的"指针",名字通常是 self,参数
# 可以自己添加内容
def function1(self):
print("这是一个实例方法: ", CObj.class_number)
# 使用 @classmethod 修饰的方法就是类方法,类方
# 法的第一个参数就是类本身,通常叫做 cls,可以
# 使用 cls 访问到当前类的类属性
@classmethod
def function2(cls):
print("这是一个类方法: ", cls.class_number)
# 在使用时和类方法没有太大区别,对
# 参数没有要求,如果想要访问类属性
# 可以直接通过类名
@staticmethod
def function3():
print("这是一个静态方法: ", CObj.class_number)
obj = CObj()
obj.function1()
obj.function2()
obj.function3()
类的私有属性
# 类的"私有"属性,所有只以双下划线开头的属性会被认为
# 是私有的,不能[直接]被外界访问到
class CObj1():
__number = 1515
# 实际上的私有只是解释器给属性进行了更名,_类名+属性名
# 可以但是不推荐使用这种方式进行访问,所有以单下划线开
# 头的命名,约定俗成都是不可访问的
print(CObj1.__dict__)
print(CObj1._CObj1__number)
继承
1.查看所有的基类
class Obj(object):
def __init__(self):
pass
# 所有的基类组成的一个元组
print(Obj.__bases__)
# 并不是所有的属性都能够被遍历到
ttt=Obj()
2.继承的形式, class 类名(父类名, …)
通过类名访问父类属性或方法
class CBase1(object):
def __init__(self):
print("CBase1")
class CBase2(object):
def __init__(self):
print("CBase2")
class CObj(CBase1, CBase2):
def __init__(self):
print("CObj")
# 可以使用父类的类名直接访问父类的属性(方法)
CBase1.__init__(self)
CBase2.__init__(self)
obj = CObj()
通过super找到父类并访问属性
class CBase1(object):
def __init__(self):
print("CBase1")
class CBase2(object):
def __init__(self):
print("CBase2")
class CObj(CBase1, CBase2):
def __init__(self):
print("CObj")
# 默认调用的是原型链中当前类的下一个
super().__init__()
# super 实际找到的类就是第一个参数在原型链中的下一个
super(CBase1, self).__init__()
obj = CObj()
3.类的相关操作
断一个类是不是另一个类的子类
class CBase1(object):
def __init__(self):
print("CBase1")
class CBase2(object):
def __init__(self):
print("CBase2")
# 继承的形式, class 类名(父类名, ...)
class CObj(CBase1, CBase2):
def __init__(self):
print("CObj")
# 可以使用父类的类名直接访问父类的属性(方法)
CBase1.__init__(self)
# 默认调用的是原型链中当前类的下一个
super().__init__()
# super 实际找到的类就是第一个参数在原型链中的下一个
super(CBase1, self).__init__()
# 判断一个类是不是另一个类的子类
print(issubclass(CObj, object))
输出当前的所有父类组成的元组
class CBase1(object):
def __init__(self):
print("CBase1")
class CBase2(object):
def __init__(self):
print("CBase2")
# 继承的形式, class 类名(父类名, ...)
class CObj(CBase1, CBase2):
def __init__(self):
print("CObj")
# 可以使用父类的类名直接访问父类的属性(方法)
CBase1.__init__(self)
# 默认调用的是原型链中当前类的下一个
super().__init__()
# super 实际找到的类就是第一个参数在原型链中的下一个
super(CBase1, self).__init__()
print(CObj.__bases__)
显示当前类的继承原型链
class CBase1(object):
def __init__(self):
print("CBase1")
class CBase2(object):
def __init__(self):
print("CBase2")
# 继承的形式, class 类名(父类名, ...)
class CObj(CBase1, CBase2):
def __init__(self):
print("CObj")
# 可以使用父类的类名直接访问父类的属性(方法)
CBase1.__init__(self)
# 默认调用的是原型链中当前类的下一个
super().__init__()
# super 实际找到的类就是第一个参数在原型链中的下一个
super(CBase1, self).__init__()
print(CObj.mro())
5.Python 存在继承关系时,不会出现二义性问题,
当访问一个属性的时候,解释器会遍历原型链,首先找到谁就用谁
异常
1.判断抛出什么类型的异常,再写抛出异常
产生异常的时候,异常的类型可以在输出窗口看到,不需要记忆
2.try finally 无论是否产生异常,都保证执行代码
try:
print("没有异常")
finally:
print("永远会执行")
3.通用的异常处理写法
try:
print(a)
# 接受任意一个异常对象并且取名字
except Exception as e:
print(e)
4.主动的抛出异常
name = input('please input name:')
if name == 'hello':
raise NameError('input name error !')