(十六)None对象
- None是一个特殊的常量,表示变量没有指向任何对象,可以将None赋值给任何变量,但不能创建NoneType类型对象
- None和其他任何类型比较都会返回False
- ==和is判断时,空列表,空字符串不会自动转成False
30 面向对象的三大特征
(一)分类
封装,继承,多态
封装:隐藏对象的属性和实现细节,只对外提供必要的方法,通过“私有属性,私有方法”的方式,实现封装。
继承:让子类具有父类的特性,更容易增进代码
多态: 同一个方法调用由于对象不同实现行为不同
(二)继承
1.一个子类可以继承多个父类,类定义中没有指定父类,则默认父类是object类,object是所有类的父类,顶一个一些所有类共有的默认实现
父类名.init(self,参数列表)
子类不重写_init_,实例化子类,调用父类的_init_,重写则不会调用
class Person:
def __init__(self,name,age):
print("创建Person")
self.name =name
self.age = age
def say_age(self):
print("{0}的年龄是{1}".format(self.name,self.age))
class Student(Person):
pass
s1 = Student("lmh",18) #lmh的年龄是18子承父类
s1.say_age()
如果重写_init_要继承父类的构造方法,可以使用super关键字,也可以这样调用:
class Person:
def __init__(self,name,age):
print("创建Person")
self.name =name
self.age = age
def say_age(self):
print("{0}的年龄是{1}".format(self.name,self.age))
class Student(Person):
def __init__(self,name,age,score):
Person.__init__(self,name,age) #重新写了构造函数,想调用父类的构造函数
#super(Student,self).__init__(self,name,age) #或者用这种方法
self.score = score
s1 = Student("lmh",18,90) #lmh的年龄是18子承父类
s1.say_age()
2.类成员的继承和重写
成员继承:子类继承父类除构造函数以外属性和方法,包括私有属性和方法
方法重写:子类可以重新写父类已有的方法,这时父类的部分会被覆盖
3.重写_str_()方法
_str_()用于返回一个“对象的描述”经常用于print()方法,帮助查看对象的信息
4.多重继承
一个子类继承多个父类,会导致类的层次结构混乱,尽量少用
class 子类(父类1,父类2...)
类体
5.MRO方法解析顺序
如果父类中有相同名字的方法,在子类没有指定父类名字时,解释器“从左向右”按顺序搜索
class 子类(父类1,父类2...)
类体
如果子类没有一个方法,就先查看父类1的,父类1有就调用,没有再查父类2
6.super()获得父类的定义
super.方法名()调用父类的方法
(三)多态
多态是方法的多态,属性没有多态
多态的存在有两个必要条件:继承、方法重写
class Animal:
def shout(self):
print("动物叫了一声")
class Dog(Animal):
def shout(self):
print("小狗,汪汪")
class Cat(Animal):
def shout(self):
print("小猫,喵喵")
def animalShout(a):
a.shout() #会产生多态,传入对象不同,调用方法不一样
animalShout(Dog()) #小狗,汪汪
animalShout(Cat()) #小猫,喵喵
31 特殊方法和运算符重载
a = 20
b = 30
c = a+b
d = a.__add__(b)
print(c) #50
print(d) #50
每个运算符都对应特殊方法