11-面向对象
2023-04-08 本文已影响0人
飘摇的水草
概念
- 面向过程:开发中小型项目效率较高,但是很难适用于如今主流的大中型项目开发,实现一个功能的时候,看重的是开发的步骤和过程,也叫面向过程编程
- 面向对象,当实现一个功能的真是个,看重的并不是过程和步骤,而是关心谁帮我做这件事,三大特征:封装、继承和多态
面向过程和面向对象是两种编程思想,编程思想是对同一个问题,解决问题的套路方式。
类和对象
类
- 是泛指的,指代多个,是由对象的抽象来的
- 在代码中,是通过关键字
class
定义的
对象
- 对象是特指的,指代一个,是具体存在的
- 在代码中,对象是由类来创建的
类的构成
类由三部分组成:
- 类名
- 属性:特性,变量
- 方法:行为,函数
类的定义
- Python中,定义类使用关键字
class
- object 是所有的类的基类,即最初始的类
- 类名,遵循驼峰命名规则
语法规则如下:
class 类名(object):
类中的代码
定义类的三种方式:
# 新式类:直接或者间接继承 object 的类,在Python3中,所有的类默认继承object类,
# 在Python 2中,默认是不继承 object 的
# 旧式类(经典类)
# PEP8规则,类定义的前后需要添加两个空行
class Dog(object):
pass
class Dog1():
pass
class Dog2:
pass
创建对象
# 新式类:直接或者间接继承 object 的类,在Python3中,所有的类默认继承object类,
# 在Python 2中,默认是不继承 object 的
# 旧式类(经典类)
# PEP8规则,类定义的前后需要添加两个空行
class Dog(object):
# 在类中定义的函数称为方法
def play(self):
print ("拆家中")
pass
dog = Dog();
print id(dog)
dog.play()
在外部给对象添加属性
即使类内部没有定义属性名,依然可以通过下面的方式来给对象添加属性:
dog = Dog()
dog.name = "HeiZi"
dog.age = 4
在类内部获取属性值
在类内部通过 self
来获取属性值
init用法
- 在
Python
的类中,有一类方法,这类方法以两个下划线开头
和两个下划线结尾
,并且在满足某相特定条件的情况下会自动调用,这类方法,称为魔法方法,魔法方法有:__init__
、__str__
、__del__
-
__init__
调用时机:在创建对象之后,会立即调用,它的作用是用来给对象添加属性,给对象属性一个初始值(构造函数),其次是代码的业务需求,每创建一个对象,都需要执行的代码可以写在__init__
里
class Dog(object):
def __init__(self,name):
self.name = name
print ("__init__方法,我被调用了")
如果 init
函数里有形参,那么在创建对象的时候传递参数,如下所示:
dog1 = Dog(name = "dkdk")
str方法
调用时机:
-
print(对象)
会自动调用__str__
方法,打印输出的结果是__str__
方法的返回值 -
str(对象)
类型转换,将自定义对象转换为字符串的时候,会自动调用
应用:
- 打印对象的时候,输出一些属性信息
- 需要将对象转换为字符串类型的时候
注意点:方法必须返回一个字符串,只有 self
一个参数
class Dog(object):
def __init__(self,name):
self.name = name
print ("__init__方法,我被调用了")
def __str__(self):
return "小狗的名字是{self.name}"
如果在类中没有实现 __str__
方法,当用 print
方法打印对象的时候,默认输出的是引用地址,如果实现了则输出 __str__
方法里 return
的字符串
del 方法
其他语言中称为析构函数
调用时机:
- 对象在内存中被销毁的时候会自动调用
__del__
方法 - 使用
del 变量
将这个对象的引用计数变为0时也会自动调用
应用场景:
- 对象被删除销毁的时候,要书写的代码可以写在
__del__
中,一般很少使用
class Cat(object):
def __init__(self,name,age):
self.name = name
self.age = age
def __del__(self):
print "del函数被调用了"
cat = Cat(age = 20,name = "测试")
del cat
查看引用计数
import sys
# 显示的会比实际的多一个
print sys.getrefcount(dog)
repr方法
这个方法和 __str__
很类似,也是返回字符串,__repr__
是给用户看的