面向对象编程是最有效的软件编写方法之一。
在面向对象编程中,所编写表示现实世界中的事物和情景的类,并基于这些类来创建对象。根据类来创建对象的过程叫实例化
类是对一系列具有相同特征或行为的事物的总称,是一个抽象的概念,不是真实存在的。
- 特征即是属性
- 行为即是方法
对象是类创建出来的真实存在的事物。
开发中,先有类,再有对象
1. 简单尝试
class Dog():
def __init__(self, name, age):
self.name = name
self.age = age
def sit(self):
print(self.name + '坐下了')
def roll(self):
print(self.name + "在打滚")
dog = Dog('哈哈','8')
print(dog.name) # 哈哈
dog.sit() # 哈哈坐下了
dog.roll() # 哈哈在打滚
- 关于
__init__
:这是一个特殊的方法,当根据类创建新的实例时,Python会自动运行它。在刚刚的方法中,__init__
有三个形参,其中第一个self是必须有也必须写在最前面的,后面两个是自己添加的。当调用这个方法来创建实例时,将自动传入实参self。每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
2. 给属性指定与修改默认值 - 指定
class Dog():
def __init__(self, name, age):
self.name = name
self.age = age
self.speed = 0
def sit(self):
print(self.name + '坐下了')
def roll(self):
print(self.name + "在打滚")
def run(self):
print(f'这只狗今天走了{self.speed}里路')
dog = Dog('haha', '18')
dog.run()
- 修改
修改有三种方法
- 通过实例
- 通过方法进行修改
- 通过方法进行递增
# 通过实例修改
dog = Dog('haha', '18')
dog.run()
dog.speed = 23
dog.run() # 这只狗今天走了23里路
# 通过方法进行修改
class Dog():
def __init__(self, name, age):
self.name = name
self.age = age
self.speed = 0
def sit(self):
print(self.name + '坐下了')
def roll(self):
print(self.name + "在打滚")
# 新增方法
def run(self):
print(f'这只狗今天走了{self.speed}里路')
def update_speed(self, num):
if self.speed < num:
self.speed = num
dog.update_speed(25)
dog.run() # 这只狗今天走了25里路
# 通过方法对属性的值进行递增
class Dog():
def __init__(self, name, age):
self.name = name
self.age = age
self.speed = 0
def sit(self):
print(self.name + '坐下了')
def roll(self):
print(self.name + "在打滚")
def run(self):
print(f'这只狗今天走了{self.speed}里路')
def update_speed(self, num):
if self.speed < num:
self.speed = num
# 新增方法
def add_speed(self, num):
self.speed += num
dog.update_speed(25)
dog.run() # 这只狗今天走了25里路
dog.add_speed(3)
dog.run() # 这只狗今天走了28里路
3. 继承
当一个类继承另一个类时,将自动获得另一个类的所有属性和方法;原有的类称为父类,新类称为子类,子类继承了父类所有的方法,同时还可以定义自己的属性和方法。
但是子类无法继承父类的私有方法,支持多重继承
class Dog():
def __init__(self, name, age):
self.name = name
self.age = age
self.speed = 0
def sit(self):
print(self.name + '坐下了')
def roll(self):
print(self.name + "在打滚")
def run(self):
print(f'这只狗今天走了{self.speed}里路')
def update_speed(self, num):
if self.speed < num:
self.speed = num
def __shu(self): # 私有属性就是前面加上两个_
print('这是私有属性,继承不了')
def add_speed(self, num):
self.speed += num
class ErHa(Dog): # ()内放入要继承的父类
def __init__(self, name, age, spec): # 接受实例所需的信息
super().__init__(name, age) # # super是特殊函数,帮助父类与子类关联起来
self.spec = spec # 子类定义属性
def spe(self): # 给子类定义方法
print(f'我的狗叫{self.name},今年{self.age}岁了,它很{self.spec}')
def run(self): # 重写父类方法
print('他只知道拆家,不知道跑步')
my_dog = ErHa('哈哈', '10', '顽皮')
my_dog.spe() # 我的狗叫哈哈,今年哈哈,它很顽皮
my_dog.run() # 他只知道拆家,不知道跑步
4. 私有继承
class Employee:
def __init__(self, name, age):
self.name = name
self.__age = age # 测试私有属性
def __work(self): # 测试私有方法
print("hard work")
e = Employee("Tom", 18)
print(e.name)
print(e._Employee__age) # 类外调用的方法:_类名__属性名
e._Employee__work()
5.多重继承
Python支持多重继承,一个子类可以有多个“直接父类”。这样就具备了“多个父类”的特点。但是由于这样会被“类的整体层次”搞的异常复杂,尽量避免使用。
class A:
def __init__(self, name):
self.name = name
def aa(self):
print(self.name)
class B:
def __init__(self, age):
self.age = age
def bb(self):
print(self.age)
class C(A, B):
def __init__(self, name, age):
super().__init__(name)
B.__init__(self, age)
def c(self):
print(self.name+self.age)
c = C('jack','18')
c.c() # jack18
6. 多态
多态是指同一个方法调用,由于对象不同可能会产生不同行为
- 多态是方法的多态,属性没有多态
- 多态的存在有两个必要条件:继承,方法重写
isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。
isinstance() 与 type() 区别:
type() 不会认为子类是一种父类类型,不考虑继承关系。
isinstance() 会认为子类是一种父类类型,考虑继承关系。
如果要判断两个类型是否相同推荐使用 isinstance()。
语法:
isinstance(object, classinfo)
参数
object -- 实例对象。
classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组。
返回值
如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False。
class Man:
def __init__(self):
pass
def eat(self):
print('饿了,吃饭饭')
class Chinese(Man):
def __init__(self):
super().__init__()
def eat(self):
print('饿了,用筷子吃饭')
class English(Man):
def __init__(self):
super().__init__()
def eat(self):
print('饿了,用叉子吃饭')
class India(Man):
def __init__(self):
super().__init__()
def eat(self):
print('饿了,用手吃饭')
def manEat(m):
if isinstance(m, Man):
m.eat() # # 多态,一个方法调用,根据对象不同调用不同的方法
else:
print('不能吃饭')
manEat(Chinese()) # 饿了,用筷子吃饭