初识面向对象
一.类与对象
1.类
class Car:
pass
c = Car # 创建对象 类名()
c.color = "红色" # 对象.属性 当属性不存在的时候,添加一个属性
c.paizhao = "冀D88888"
c.pailiang = "4.8T"
print(c.color)
print(c.pailiang)
print(c.paizhao)
c.color = "黑色" # 当属性存在的时候就是修改
print(c.color)
2.升级版 类
__init__ 方法是一个特殊的方法,初始化方法(构造方法)
在创建对象的时候会自动的调用__init__()
self 就是你创建出来的那个对象 ,当前类的对象
在类中写的函数(self)叫 方法
class Car:
def __init__(self, color, paizhao, pailiang):
self.color = color
self.paizhao = paizhao
self.pailiang = pailiang
# self 就是当前类的对象
def pao(self): # self是自动传递的
print("跑起来")
def jump(self):
print(f"{self.color}跳起来")
c = Car("红色", "冀D88888", "4.8T") # 创建对象的时候会自动调用__init__()
print(c.color)
c1 = Car("黑色", "冀D66666", "2.0T")
print(c1.color)
c.jump()
c1.jump()
二.面向对象和面向过程的对比
1.对比
脚本,此时的代码是最简单的.不需要构思整个程序的概况
函数式编程,比脚本麻烦点,对功能有了概况. 函数侧重的是功能
面向对象编程,是对整个系统进行分析,分析除需要哪些对象,然后给对象进行归类. 面向对象侧重是的归类
2.总结
面向过程:程序相对比较小,不需要大规模的设计时候用
面向对象:程序非常大,项目管理,维护成本很高.此时更适合用面向对象,可维护性好
三.面向对象的三大特征
1.封装性 可以封装不相关的东西
1.对属性的封装 (在创建对象的时候进行封装)
2.对功能(或方法)的封装
3.模块 包
class Student:
def __init__(self,num,name,cls): # 对属性的封装
self.num = num
self.name = name
self.cls = cls
stu = Student("10010","小明","三年二班")
def kill(s):
print(f"kill {s.name}")
kill(stu)
2.继承
定义 : 子类自动拥有父类中除了私有内容的其他所有内容
目的 : 对父类进行扩展
class Foo:
def money(self):
print("give me money")
class Bar(Foo):
pass
br = Bar()
br.money() # 此时调用的时父类中的方法
类中方法的查询顺序: 先找自己,然后再找父类
class Animal:
def dong(self):
print("驾驾驾")
class Cat(Animal): # 子类其实是对父类的扩展
def dong(self): # 子类中写了和父类中一样的功能,这个叫覆盖.重写
print("小碎步走起")
def budong(self):
pass
# a = Animal()
# a.budong() # 报错 因为父类不能使用子类中的方法
c = Cat()
c.dong() # 类中功能的查询顺序 : 先找自己,然后再找父类
多继承 : python支持多继承,遵循MRO
3.多态性 (注意等效替换)
定义 : 同一个对象,多种形态. (一个东西,多种叫法)
优点 : 超强的可扩展性.面向对象的核心
推断 : python支持的是鸭子类型,会嘎嘎叫的东西就是鸭子.为了程序能够正常执行,本来需要传递进来的是一只鸭子,但是只需要传递一个 会嘎嘎叫的东西就行
class Animal:
def chi(self):
print("会吃")
class Cat(Animal):
pass
class Dog(Animal):
pass
class Pig(Animal):
pass
class Person:
def wei(self,who):
who.chi() # 鸭子模型,只要包含chi的方法的 都能传入
c = Cat()
d = Dog()
p = Pig()
per = Person()
per.wei(c)
per.wei(d)
per.wei(p)

浙公网安备 33010602011771号