Python基础(七)面向对象
Python基础(七)
1、面向对象
1.1、编程范式
- 面向过程:根据业务逻辑从上到下写代码
- 强调步骤、过程、如何实现业务。
- 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
- 面向对象编程(oop):将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程
- 强调由那个对象进行处理,不必由一个对象执行全部的业务代码,可以分配给多个对象完成业务。
1.2、面向对象编程
- 面向对象:按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的办法。
- 面向对象编程(Object Oriented Programming-OOP):是一种解决软件复用的设计和编程方法。这种方法把软件系统中相近相似的操作逻辑和操作应用、数据、状态,以类的形式描述出来,以对象实例的形式在软件系统中复用,以达到提高软件开发效率的作用。
1.3、三大特征
- 封装
- 封装是将内容封装到某个地方,以后再去调用被封装在某处的内容。
- 隐藏了对象的属性和实现细节,只对外提供必要的方法。
- 继承
- 如果一个新类继承自一个设计好的类,就直接具备了已有类的特征。
- 继承可以让子类具有父类的特性,提高了代码的重用性。
- 多态
- 在面向对象语言中,接口的多种不同的实现方式即为多态。
- 对同一个方法调用,由于参数或对象的不同可能会产生不同的行为。
2、类和对象
2.1、类
1. 类是什么
-
类就是一个模板,模板里可以包含多个特征(属性)与行为(方法)
-
抽出公共的特征归纳为类的属性,信息存储在属性中
-
归属于类函数称之为方法,在方法中实现一些功能
-
类其实就是对多个实例抽象化的一个模板,将相同的特征与行为进行归纳
-
2. 类的组成部分
类(Class)由3个部分构成
- 类的名称:类名
- 类的属性:数据
- 类的方法:允许对进行操作的方法(行为)
2.2、类的定义
1. 定义
'''
定义类 语法:
class 类名:
属性
方法
'''
class People:
name = '张三'
age = 18
def say(self):
print("Hello,word")
2.3、对象
1. 对象是什么
- 对象则是根据模板创建的实例,通过实例对象可以执行类中的函数
- 对象就是由抽象化的类,通过将类的属性赋值操作,进行实例化的成果
- 对象具有类的属性与方法
2.4、对象创建
1. 创建
class People:
name = '张三'
age = 18
def say(self):
print("Hello,word")
'''
创建对象 语法:
对象名=类名()
'''
p1 = People()
print(p1.name) # 张三
p1.say() # Hello,word
2.5、self
self和对象指向同一个内存地址,可以认为self就是对象的引用,是实例的本身。
self.__ class __是指向类。
在类中才会有实际的意义,一般作为实例方法的第一个参数,不需要传值,解释器会自动将调用方法的对象传过去。变量名self是约定的,可以进行改变(只是占据第一个参数位)。
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def printSelf(self):
print(id(self)) # 1854650941792
print(self.__class__) # <class '__main__.Animal'>
pass
cat = Animal('cat', 15)
print(id(cat)) # 1854650941792
cat.printSelf()
3、类中方法
3.1、分类
- 实例方法
- 类方法
- 静态方法
3.2、实例方法
实例方法或者叫对象方法,指的是在类中定义的普通方法。
只有实例化对象之后才可以使用的方法,该方法的第一个形参接收的一定是对象本身(与参数名无关)。
在某个实例 对象调用方法时python解释器会自动把这个对象作为第一参数传递给self,开发者只需要传递后面的参数即可。
示例:
class People:
name = '张三'
age = 18
def say(self, name, age):
print(self, name, age)
p1 = People()
p1.say('张三', 20) # <__main__.People object at 0x000000000268C820> 张三 20
3.3、类方法
无需实例化,可以通过类直接调用的方法,但是方法的第一个参数接收的一定是类本身,在方法上面添加@classmethod进行标识。可以通过类或实例对象调用。
示例:
class People:
country = 'China'
def __init__(self, name, age):
self.name = name
self.age = age
# 类方法
@classmethod
def printCountry(cls):
return cls.country
@classmethod
def changCountry(cls, data):
cls.country = data
pass
p1 = People("张三", 20)
print(p1.printCountry()) # China
p1.changCountry("测试")
print(p1.printCountry()) # 测试
3.4、静态方法
静态方法由类调用,无默认参数。将实例方法参数中的self去掉,然后在方法定义上方加上@staticmethod,就成为静态方法。它属于类,和实例无关。可以通过类或实例对象调用。
一般只是一些公共方法,不会使用静态方法涉及到类中的方法和属性的操作。
示例:
import time
class myTime:
@staticmethod
def showTime():
return time.strftime("%H:%M:%S", time.localtime())
print(myTime.showTime()) # 21:47:40
4、属性
4.1、分类
- 类属性(静态属性)
- 实例属性
4.1、类属性(静态属性)
类内部定义的变量。是在类级别定义的,不是在构造方法__ init __()或其他方法内部定义的,称之为类属性。多个实例对象之间共享一份类属性,可以使用类,或实例对象访问但是只能通过类修改类属性。
4.2、实例属性
在方法内部通过self引用定义出的属性称之为实例属性。(也可以通过对象添加属性)。独立的对象之间的实例属性不互相影响。只能使用实例对象访问。
4.3、示例
class Animal:
kind = 'animal' # 类属性
def __init__(self, age):
self.age = age # 实例属性
pass
print(Animal.kind) # animal
dog = Animal(20)
dog.name = 'dog' # 实例属性
print(dog.kind) # animal
print(dog.age) # 20
print(dog.name) # dog
cat = Animal(18)
cat.name = 'cat' # 实例属性
print(cat.kind) # animal
print(cat.age) # 18
print(cat.name) # cat
5、魔术方法
5.1、概述
在python中,有一些内置好的特定的方法,方法名是“_ _ xxx _ _ ",在进行特定的操作时会自动被调用,这些方法称之为魔法方法。
5.2、常见方法
- init方法:初始化一个类,在创建实例对象为其赋值时使用。
- str方法:在将对象转换成字符串str(对象)测试的时候,打印对象的信息。
- new方法:创建并返回一个实例对象,调用了一次,就会得到一个对象。
- class方法:获得已知对象的类(对象.__ class __)。
- del方法:对象在程序运行结束后进行对象销毁的时候调用这个方法,来释放资源。
1. init
触发机制:初始化对象时自动触发
作用:完成一些属性数值的初始化设置
说明:
__ init __(self),初始化方法,实例化对象的时候自动调用,用于完成一些初始化设置。创建新对象时是默认调用的,不需要手动调用。
注意:init方法一个类只能有一个,与Java不同。
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
pass
cat = Animal('cat',15)
print(cat.name) # cat
2. new
触发机制:创建对象时自动触发
作用:完成对象的实例创建
说明:
__ new__(cls, *args, **kwargs)创建实例化方法,cls代表当前的类,也不需要手动传递。
注意:创建对象时会先执行new函数,创建一个对象后执行init函数,与init数据的初始化不同new是对对象的初始化。
class Animal:
def __init__(self, age):
self.age = age
def __new__(cls, *args, **kwargs):
print("new函数")
return object.__new__(cls) # 创建
pass
3. del
触发机制:析构方法会在对象被销毁时自动触发
作用:关闭一些不用的开发资源
注意:是对象被销毁时触发了这个析构方法,而不是这个析构方法销毁对象
对象会在哪些情况下被销毁
- 当程序执行完毕,内存中所有的资源都会被销毁释放
- 使用 del 删除时
- 对象不在被引用时,会自动销毁
class Animal:
def __init__(self, age):
self.age = age
def __new__(cls, *args, **kwargs):
print("new函数")
return object.__new__(cls)
def __del__(self):
print("del方法")
pass
dog = Animal(20)
dog.name = 'dog'
cat = Animal(20)
cat.name = 'cat'
del cat
print("程序结束")
# 输出
# new函数
# new函数
# del方法
# 程序结束
# del方法
4. str
触发机制:打印对象时自动触发
作用:将对象按照定义的方法转换成字符串
注意:使用str方法,需要先在类中定义str方法。
在打印对象时会打印对象的内存地址,自定好str方法后会将对象按照定义的方法转换成字符串。
class Animal:
kind = 'animal' # 类属性
def __init__(self, age):
self.age = age # 实例属性
def __str__(self): # 定义str方法
return 'kind is %s age %s ' % (self.kind, self.age)
pass
print(Animal.kind) # 类属性
dog = Animal(20)
dog.name = 'dog' # 实例属性
print(dog.__str__()) # kind is animal age 20
print(dog) # kind is animal age 20
6、小结
6.1、类和对象的概念
类就是一个模板,模板里可以包含多个属性与函数,属性存储一些数据,函数里实现一些功能;
对象则是根据模板创建的实例,通过实例对象可以执行类中的函数。
6.2、定义类和对象
使用class 语句来创建一个新类,class之后为类的名称并以冒号结尾;
实例化类其他编程语言中一般用关键字new,但是在Python中并没有这个关键字,类的实例化类似函数调用方式。
6.3、实例方法与属性
在类的内部,使用def关键字可以定义一个实例方法
定义在类里面,方法外面的属性称之为类属性
定义在方法里面使用self 引用的属性称之为实例属性
6.4、self
self和对象指向同一个内存地址,self就是对象的引用。
6.5、魔术方法
在python中,有一些内置好的特定的方法,方法名是“_xxx_”,在进行特定的操作时会自动被调用。