继承 :
注意圆括号中基类的顺序,若是基类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找基类中是否包含方法
当生成子类对象时,先初始化父类对象,所以如果父类有__init__()方法,并且有属性时,要通过子类的构造赋值
一个类可以有多个子类
注意:先调用 __NEW__ 用来构造 生成对象 再调用__init__
class A:
def __init__(self,name=None):
self.name=name
print("a...")
class B:
def __init__(self,age):
self.age=age
print("b...")
class C(A,B):
def __test__(cls,*args,**kwargs):
print("test")
def __init__(self,name=None,age=None): #再调用__init__
A.__init__(self,name)
B.__init__(self,age)
print("c...")
def __new__(cls, *args, **kwargs): #先调用 __NEW__ 用来构造 生成对象
print("new...")
return object.__new__(cls)
@classmethod :
classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。
#类方法:在方法上添加@classmethod
@classmethod
def test(cls):
print("这是一个类方法")
@staticmethod :
静态方法:静态方法没有参数,静态方法既和类没关系,也和对象没关系,也可以通过类和对象调用
@staticmethod
def statictest():
print("这是一个静态方法")
类属性与方法 :
类的私有属性 :
__private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs
类的方法 :
在类地内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例
self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定是用 self
类的私有方法 :
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类地外部调用。self.__private_methods
类的专有方法:
__init__ : 构造函数,在生成对象时调用 __del__ : 析构函数,释放对象时使用
__repr__ : 打印,转换 __setitem__ : 按照索引赋值
__getitem__: 按照索引获取值 __len__: 获得长度
__cmp__: 比较运算 __call__: 函数调用
__add__: 加运算 __sub__: 减运算
__mul__: 乘运算 __div__: 除运算
__mod__: 求余运算 __pow__: 乘方
单例模式 :
class SingleTone:
#定义私有属性 __instance=None #构造方法 def __new__(cls): #判断 __instance是否为空 if cls.__instance==None: #为空时创建 cls.__instance=object.__new__(cls) return cls.__instance else: #不为空时返回 return cls.__instance s=SingleTone() ss=SingleTone() print(id(s),id(ss))
对象列表进行排序 :
class Car:
def __init__(self,brand=None,price=None):
self.brand=brand
self.price=price
#gt 排序
def __gt__(self, other):
#return other.brand.encode("gbk")>self.brand.encode("gbk")
return self.price>other.price
#lt排序
#def __lt__(self, other):
#中文排序 按照首字母 加 .encode("gbk")
# return self.brand.encode("gbk")<other.brand.encode("gbk")
#return self.price<other.price
def __str__(self):
return self.brand+str(self.price)
lists=[Car("宝马",200000),Car("奥迪",400000),Car("大众",320000)]
lists.sort()
for i in lists:
print(i)
python处理异常 :
try语句按照如下方式工作;
首先,执行try子句(在关键字try和关键字except之间的语句)
如果没有异常发生,忽略except子句,try子句执行后结束。
如果在执行try子句的过程中发生了异常,那么try子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的except子句将被执行。最后执行 try 语句之后的代码。
如果一个异常没有与任何的except匹配,那么这个异常将会传递给上层的try中。
一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。最多只有一个分支会被执行。
处理程序将只针对对应的try子句中的异常进行处理,而不是其他的 try 的处理程序中的异常
例如 :
def devide():
try:
1/0
except ZeroDivisionError as zd: #zd 表示异常本身信息
print("除数不能为0")
print(zd)
else:
print("没有异常")
devide()
异常以不同的类型出现,这些类型都作为信息的一部分打印出来: 例子中的类型有 ZeroDivisionError,NameError 和 TypeError。
运行结果 : 抛出异常 进入 except ZeroDivisionError语句 除数不能为0 可以用as zd 表示异常本身信息