一、什么是面向对象?
面向对象是一个更大的封装,关注的是做事情的人是谁,而面向过程关注的是怎么做。
二、什么是类和对象?
1.类
类即一类事物的总称,是抽象的。比如鸟类,猫科动物,这些统称为类。
如何定义类?
使用class来定义,类名遵循大驼峰命名规范,如:class Dog(object):
2.对象
对象是从类中创建出来,具体存在的。比如布谷鸟,啄木鸟就是一个具体的对象。
如何创建一个对象?
将类名赋给一个变量,如:wangcai = Dog()
三、面向对象的三大特征
1.封装
将属性和方法进行封装,需要使用的时候通过对象来调用
将类的属性封装(隐藏)起来,提供公开的方法来访问,使用双下划线__来隐藏属性
封装的三种写法
<1> get 和 set
class People(object):
def __init__(self, name):
self.__name = name
def get_name(self):
return self.__name
def set_name(self,name):
self.__name = name
·······························
bob = People("bob",12)
print(bob.get_name()) // 通过get_name查看
bob.set_name("tom") // 设置名字
print(bob.get_name())
<2>property函数
在<1>中定义函数的末尾添加
name = property(get_name,set_name)
..................................
bob = People("bob",12)
print(bob.name) // 打印bob的名字
bob.name = 'baibai' // 修改bob的名字,注意使用的是name,不再是set_name
print(bob.name)
<3>装饰器
访问和<2>一样
class People(object):
def __init__(self, name):
self.__name = name
@property
def name(self):
return self.__name
@name.setter
def name(self,name):
self.__name = name
2.继承
类与类之间存在一种继承的关系,通俗讲子承父业
例:在如下中,父类含有公开的test方法,子类可以继承,调用父类方法,查看结果
class Father(object):
def __init__(self):
self.name = "bob"
def test(self):
print("-----test-----")
class Son(Father):
pass
haha = Son() // 创建子类对象
haha.test() // 调用父类方法
注:只能继承公开的方法和属性,除了私有属性和方法,都能被继承
方法重写/覆盖(override)
若父类的方法不能满足子类使用的时候,就可重写此方法。注:覆盖时,方法名称和参数必须一模一样
在上例中,我们去修改父类的test方法,查看结果调用情况
class Father(object):
def __init__(self):
self.name = "bob"
def test(self):
print("-----father-----")
class Son(Father):
def test(self):
print("-----son-----")
haha = Son()
haha.test()
调用原则:就近调用 ,子类拥有该方法,则会调用自己的
super关键字
如果子类重写父类的方法后,又想调用父类的方法,则可以使用super关键字
在上例子类中的方法下添加,调用结果即为父类的test方法
class Son(Father):
def test(self):
super().test()
多继承
可以一个子类拥有多个父类
class Father(object):
def __init__(self):
self.name = "bob"
def test(self):
print("-----father-----")
class A(Father):
def test(self):
print("-----A-----")
class B(Father):
def test(self):
print("-----B-----")
class C(A,B):
pass
cc = C()
cc.test() // 会调用父类A的方法
print(C.__mro__) // 通过此代码可以查出方法调用顺序
3.多态
定义时的类型和运行时的类型不一样即为多态。当引用对象时,才确定究竟是调用哪一个类
class Dog(object):
def test(self):
print("-----把你们经理叫来-----")
class Cat(Dog):
def test(self):
print("-----董事长我知道错了-----")
def state(value):
value.test()
tom = Dog()
jerry = Cat()
state(jerry)