一、面向对象的三大特征
1.封装:提高程序安全性,若不希望外部调用类属性,可以加两个下划线。
2.继承:提高代码复用性。
3.多态:提高程序的可扩展性和可维护性。
二、封装
对实例属性使用两个下划线,例如self.__age = age
,此时外部不可调用__age(相关代码详见链接: Python基础知识(12):类与对象)。
注意:使用stu._Student__age可以强行调用,_Student__age是在dir(stu)中找到的。
三、继承
1.语法
class 子类类名(父类1, 父类2,.....):
pass
2.若一个类没有继承任何类,则默认其父类为object。
3.Python支持多继承:class C(A, B):
4.定义子类时,必须在其构造函数中调用父类的构造函数。
例:
class Person():
def __init__(self, name, age):
self.name = name
self.age = age
def info(self):
print(self.name)
print(self.age)
class Student(Person):
def __init__(self, name, age, score):
# 父类的构造函数
super().__init__(name, age)
self.score = score
# 调用
stu = Student('张三', 20, 100)
stu.info() # 继承自父类
5.方法重写
1)若子类对继承自父类的某个属性或方法不满意,可以再子类中对其进行重写。
2)子类重写后的方法中可以通过super().XXX()
调用父类中被重写的方法。
例:上述代码,Person的方法info中没有score,可以再Student中对info进行重写:
def info(self):
supper().info()
print(self.score)
四、object类
1.是所有类的父类,所有类都有object类的属性和方法。
2.dir()可以查看指定对象的所有属性。
3.object有一个__str__方法,帮我们插卡对象的信息。
五、多态
1.即便不知道一个变量所引用的对象到底是什么类型,仍可以通过这个变量调用方法,在运行过程中根据变量所引用的对象类型,动态的决定调用对象中的方法。
class Animal(object):
def eat(self):
print('吃!')
class Cat(Animal):
def eat(self):
print('Cat')
class Dog(Animal):
def eat(self):
print('Dog')
class Person(object):
def eat(self):
print('Person')
def fun(animal):
animal.eat()
# 调用
fun(Dog())
fun(Cat())
fun(Person())
2.静态语言实现多态的三个必要条件:继承、方法重写、父类引用指向子类对象。
3.动态语言的多态崇尚“鸭子类型”。
六、特殊属性
1.__dict__:获取类对象或实例对象所绑定的所有属性和方法的字典。
2.__class__:获取对象的所属类。
3.__bases__:获取父类类型的元素。
4.__base__:多重继承时,输出第一个父类。
5.__mro__:类的层次结构。
6.__subclasses__:用于获取该类下的子类列表。
七、特殊方法
1.__len__():通过重写__len__()方法,让len()的参数可以试试自定义类型。
2.__add__():通过重写该方法,可使自定义对象有+的功能。
3.__new__():用于创建对象。
4.__init__():对创建的对象进行初始化。
八、类的浅拷贝与深拷贝
(一)浅拷贝
只拷贝了一个地址,两个变量指向的还是同一个对象。
(二)深拷贝
copy模块的deepcopy函数,可以将对象的所有内容拷贝至另一个变量。