python 面向对象知识点概括
目录
1 .面向对象介绍
2 .类
3 .对象
4 .对象的属性
5 .方法 / 魔法方法
6 .继承
内容 :
一 面向对象介绍
为了更容易理解面向对象 , 我们先说面向过程:
面向过程 和 面向对象 都是一种思想
面向过程 :
面向过程是一种以过程(步骤)为中心的编程思想;
面向过程是人类的思考问题的一种习惯;
目的 →步骤1→步骤2→…→完成
面向对象 :
面向对象也是一种编程思想;
面向对象是一种以事物(对象)为中心的编程思想;
面向对象是以功能来划分问题,而不是步骤;
二 类
类是具有相同属性(特征)和行为(动作)的一组对象的集合
类就是分类、类别、模板、概念等,类是无形的、看不见、摸不着,不实际存在的
类就相当于制造飞机时的图纸,用它来进行创建的飞机就相当于对象
类的构成
类(Class) 由3个部分构成
- 类的名称:类名
- 类的属性:一组数据
- 类的方法:允许对进行操作的方法 (行为)
class 类名:
属性
方法
三 对象
- 客观世界中任何一个事物都可以看成一个对象,对象看得见、摸得着,实际存在的。
- 对象是构成系统的基本单位。任何一个对象都应具有这两个要素:属性(Attribute)和行为(Behavior)。
- 对象来自于某个类,对象不能单独存在。一个类可以产生千千万万个对象。
- 对象和类的关系是,对象是类的实例,类是对象的模板。
- 类是抽象的,几乎不占用内存,而对象是具体的,占用存储空间。
创建对象的格式:
对象名1 = 类名()
四 对象的属性
添加属性 :
class A:
def p(self):
print("AAAA")
a = A()
a2 = A()
a.name = '字母'
print(a.name)
这种方式添加属性, 只能给a添加 , a2 是没有这个属性的 , 这种方法也不常用 , 我们一般都在创建类的时候就定义好了对象的属性. 通过 __init__方法
私有属性 :
格式 :在属性名和方法名 前面 加上两个下划线 __
类的私有属性 和 私有方法,都不能通过对象直接访问,但是可以在本类内部访问;
私有属性 和 私有方法 往往用来处理类的内部事情,不通过对象处理,起到安全作用。
五 方法 / 魔法方法
方法就是函数, 类里面定义的方法,可以使用对象去调用(类也可以调用)
魔法方法: 在python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做“魔法”方法
_init_() :
创建对象后,python解释器默认调用__init__()方法;
class A:
# 属性
def __init__(self):
print('------init--------')
self.name = '字母大A'
self.age = 1
_init_()方法,在创建一个对象时默认被调用,不需要手动调用
_init_(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递过去。
__init__方法接收参数
class Cat:
# 属性
def __init__(self, name, age):
print('------init--------')
self.name = name
self.age = age
tom = Cat('汤姆', 16)
- 在类内部获取 属性 和 实例方法,通过self获取;
- 在类外部获取 属性 和 实例方法,通过对象名获取。
- 如果一个类有多个对象,每个对象的属性是各自保存的,都有各自独立的地址;
- 但是实例方法是所有对象共享的,只占用一份内存空间。类会通过self来判断是哪个对象调用了实例方法。
__new__方法
class A(object):
def __new__(cls):
print("这是 new 方法")
return object.__new__(cls)
a = A()
-
__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供
-
__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例
-
__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要
用处就是单例模式的时候用到 ,平时不写也行,默认执行
__str__方法
class Cat:
# 属性
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return "我是一个猫"
tom = Cat('汤姆', 16)
print(tom)
如果没有用__str__方法,直接就打印对象地址
如果类定义了__str__(self)方法,那么就会打印从在这个方法中 return 的数据
__str__方法通常返回一个字符串,作为这个对象的描述信息
__del__方法
当删除对象时,python解释器会默认调用一个方法,这个方法为__del__()方法
class Cat:
# 属性
def __init__(self, name, age):
self.name = name
self.age = age
def __del__(self):
print("%s 被 GM 干掉了..." % self.name)
tom = Cat('汤姆', 16)
有一个引用计数的概念 :
当有变量保存了一个对象的引用时,此对象的引用计数就会加1;
当使用del() 删除变量指向的对象时,则会减少对象的引用计数。如果对象的引用计数不为1,那么会让这个对象的引用计数减1,当对象的引用计数为0的时候,则对象才会被真正删除(内存被回收)。
六 继承
在程序中,继承描述的是多个类之间的所属关系。
一个类A里面的属性和方法可以通过继承的方式,传递到类B里。
那么类A就是基类,也叫做父类;类B就是派生类,也叫做子类。
# 父类
class A:
def __init__(self):
self.num = 10
def print_num(self):
print(self.num + 10)
# 子类
class B(A):
pass
虽然子类没有定义__init__方法初始化属性,也没有定义实例方法,但是父类有。所以只要创建子类的对象,就默认执行了那个继承过来的__init__方法
子类在继承的时候,在定义类时,小括号()中为父类的名字
父类的属性、方法,会被继承给子类
只有一个父类的继承,叫做单继承
子类可以调用自己创建的方法,也可以调用父类的方法
重写: 子类写的方法和父类重名,就是对父类方法的重写
重写后,子类调用方法,就会执行自己方法里的内容
子类调用父类的方法 三种方式
- 父类类名.方法名(self)
- super(子类类名,self).方法名()
- super().方法名() 这种用的比较多
子类不可以用super调用父类的属性
私有方法和私有属性无法被继承
可以继承多个父类
如果多个父类中有同名的 属性和方法,则默认使用第一个父类的属性和方法(根据类的魔法属性mro的顺序来查找)