面向对象编程:opp
类:用来描述具有相同属性和方法的对象的集合,定义了该集合中每个对象所共有的方法和属性,对象就是类的实例
方法:类中定义的函数
类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且周期函数体之外,类变量通常不作为实例变量使用
方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写
局部变量:定义在方法中的变量,只作用于当前实例的类。
实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的
self: 代表的是类的实例,代表当前对象的首地址,如果对象没有引用了首地址 它称为垃圾对象 垃圾对象会被垃圾回收机制 自动回收
魔法方法 :
__init__()魔法方法 在其他语言中称为构造方法(构造器)
魔法方法__init__()在实例化对象时会自动调用
一个类如果没有显示定义__init__()魔法方法 那么系统会为该类提供一个默认的无参数的__init__()方法
一个类如果显示定义了魔法方法__init__()name会把系统提供的默认无参数的__init__()方法覆盖
魔法方法在实例化对象时会自动调用
魔法方法在实例化对象的同时 可以初始化变量
方法重载:
overload overloading
在同一个类,有多个方法时 方法名相同 参数列表不同 就是方法重载
python不支持方法重载
传递:
可变类型:dict list object
不可变类型:int float str tuple bool None
对象也是可变类型
对象作为参数进行传递是值传递还是引用传递?
python语言中,对象作为参数进行传递 是值传递和引用的综合使用
形式参数如果接收的数据类型是不可变类型 就是值传递
形式参数如果接受的数据类型的是可变类型 就是引用传递
封装:
就是把属性和行为私有化 达到封装的目的
属性的访问级别:
1,私有的
2,公开的
私有属性:就是在属性之前添加__
私有属性和行为只能在本类中直接使用
属性一旦私有化就应该对外界提供功能的setter和getter方法以便于外界对属性的设置和获取
setter函数的书写:
1.使用def关键字
2.函数名 set+你设置的属性
3.set函数都有参数 参数就是你设置的属性名
getter函数的书写:
1.使用def关键字
2.函数名 get+你获取的属性
3.get函数没有参数
函数的封装:
函数一旦封装 只能在本类内部使用 外界无法访问
所以一般情况下 函数很少封装
限制类中 可以出现的属性
__slots__=["__name","sex","say"];
继承:
同类事物具有共性 又有特性
根据抽象原则,抽取同类事物的共性 舍去特性 就形成了同类事物的父类
子类只需要关注自己特有的属性和行为
新类可以从现有的类 向外派生这样的过程叫做继承
新类被称为子类
现有的类被称为父类
在python3中所有的类 都直接或者间接继承object类
object类是所有类的超类(基类)
继承的语法: (同时有继承多个父类时,哪个父类名在前为准)
class 子类名(父类名,父类名,...父类n):
在python语言中 一个子类可以继承多个父类
一个类父类也可以有多个子类
继承是有传递性的
子类继承父类 非私有的属性和行为
子类继承父类私有属性的setter和geetter方法
子类无法继承父类的魔法方法. __init__()
子类除了从父类继承的属性和行为外
还可以扩展自己特有的属性和行为 这称为子类扩展
关于类的继承中父类和子类的查看:
直接父类的查看可以使用:
类名.bases
所有父类的查看可以使用:
类名.mro
方法重写:
子类从父类继承的某个实例方法 不满足子类的需求时
可以对父类方法 进行重新实现这称为方法重写 方法覆盖 方法覆写 override overriding
子类中定义了和父类一样的方法(继承到)
不同的对象调用同一个方法 展现不同的效果(为后期多态打下前提)
子类从父类继承的方法,如果子类重写 调用的就是重写的方法、
如果子类没有重写 调用的父类的方法
super()函数 ;
指向父类对象
在子类中可以使用super().函数名 调用父类的函数
如果父类的类变量 被子类同名的类变量隐藏时
可以使用super().变量 | 父类名.变量名 |对象名 调用被隐藏的父类类变量
多态:
多态:
故名思意就是多种形态
多态产生的前提:
1.继承
2.函数重写
3.向上转型
"""
class Animal:
def eat(self):
print("动物就喜欢吃");
class Dog(Animal):
def eat(self):
print("狗喜欢吃排骨");
class Cat(Animal):
def eat(self):
print("猫喜欢吃鱼");
a=Animal();
a.eat();
a=Dog();
a.eat();
a=Cat();
a.eat();
实例成员和类成员:
""
实例变量:
self.变量名声明的
实例变量只能使用对象名调用
类变量:
在函数之外,直接在类体中 声明的变量
类变量可以使用对象名调用 也可以使用类名调用
每个对象都会有自己独特的实例变量
类变量会被所有的对象共享
实例方法:
在声明方法时 有self参数
静态方法:和以前的普通的方法是一样的 但是需要添加一个装饰器(@staticmethod)
类方法:
需要一个装饰器(@classmethod) 类方法需要传一个参数cls(class的简写)
类方法,实例方法,静态方法都可以使用对象名直接调用