Python从设计之初就已经是一门面向对象的语言。面向对象的程序设计的核心是对象。一切皆对象。
面向对象介绍
是面向过程的程序设计,著名的例子有Linux內核,git,以及Apache HTTP Server等。一旦完成就很少变化的场景。就像是吃饭,面向过程就是需要一步步去完成。
1.买菜 > 2.洗菜 > 3.切菜 > 4.炒菜 > .... > 洗碗
面向对象的程序设计的核心是对象。需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方。还是吃饭的例子,面向对象则只需要去餐厅吃饭,那么餐厅就是一个对象,具体做饭的过程我们不需要关心。面向对象里面有很多细节的东西。
- 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
- 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
- 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
- 局部变量:定义在方法中的变量,只作用于当前实例的类。
- 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
- 继承:即一个子类继承父类的字段和方法。继承也允许把一个子类的对象作为一个父类对象对待。
- 实例化:创建一个类的实例,类的具体对象。
- 方法:类中定义的函数。
- 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
类
创建类
class ClassName: 代码块
下面是一个简单python类的例子
class Man: def __init__(self): self.gender = '男性' self.name = None self.age = None
创建实例对象
man2 = Man()man2.name = '张益达' man2.age = 20print(man2.name)print(man2.age)
成员方法
class Man: def __init__(self): # 成员变量 self.gender = '男性' self.name = None self.age = None def run(self,num1): # 成员方法 print('今天跑了%s千米' % num1) def sing(self,num2): print('今天唱了%s首歌' % num2)# 创建对象man1 = Man()# 调用成员方法man1.run(5)man1.sing(5)print('~' * 50)man2 = Man()man2.run(2)man2.sing(2)
魔术方法--__init__()和__str__()
对于程序中声明, 定义的方法在特定的时机便会自动执行的方法, 称为魔术方法。__init__() 方法在创建对象时被运行, 无需手工调用即可执行。
class Man: # __init__方法在创建对象的时候已经被调用运行了 def __init__(self):# 类变量(成员变量) self.gender = '男性' self.name = None self.age = None# 创建对象man1 = Man() #此时__init__()方法就应经被调用了
__str__() 方法在使用 print 函数打印对象的时候, 会自动执行代码, 也属于魔术方法。定义格式:
def __str__(self): return "显示的信息"
一般自己写的时候都是重写了__str__() 方法
class Man: def __init__(self): # 成员变量 self.gender = '男性' self.name = None self.age = None def run(self,num1): # 成员方法 print('今天跑了%s千米' % num1) def sing(self,num2): print('今天唱了%s首歌' % num2) # 在print打印对象的时候,自动执行,在这里是重写了__str__方法 def __str__(self): return 'I love python' # 创建对象man1 = Man()# 调用成员方法print(man1) #此时__str__方法被调用
成员方法调用成员
成员方法调用成员变量 ❤ 公有变量 : 可以访问, 通过self.变量名调用 ❤ 独有变量 : 谨慎操作
两种变量定义的区别:在类定义中声明的变量为 公有变量/公有属性 ,每个对象均拥有此变量对应的属性 在创建对象后声明的变量为 独有变量/独有属性 , 仅当前对象存在此变量对应的属性
成员方法调用成员方法:
self.方法名()
self仅出现在成员方法中, 指代执行该方法的对象。
成员方法调用公有变量/公有属性
class Man: def __init__(self): # 成员变量 self.gender = '男性' self.name = None def myself(self): # 成员方法 print('我叫%s,我是一个%s' % (self.name,self.gender))man1 = Man()man1.name = '张三'man1.myself()
成员方法调用私有变量/私有属性
class Man: def __init__(self): # 成员变量 self.gender = '男性' self.name = None def myself(self): # 成员方法 print('我叫%s,我是一个%s,我长得很%s' % (self.name,self.gender,self.looks))# 建立在该对象有这个私有变量的条件下man1 = Man()man1.name = '张三'man1.looks = '帅'man1.myself()# 该对象没有looks这个私有属性man2 = Man()man2.name = '李四'man2.myself()### 成员方法是有办法调用成员的私有变量的,但是在没有该私有属性的对象时候,会报错
类变量和类方法
类变量
类中的成员变量描述对象的属性值根据对象不同, 会产生区别, 称为实例变量。类中的成员变量描述对象的属性值根据对象不同, 不会产生区别, 称为类变量。
类变量是归属类的, 实例变量是归属对象的。
class Man: gender = '男' # 类变量,对象不同,值不变 def __init__(self,name,location): # 实例变量,对象不同,会有不同的值 self.name=name # self.gender = gender self.location = location def myself(self): print('我叫做%s,我是一个%s人,来自%s' % (self.name,self.gender,self.location))man1 = Man('李四','江苏')man1.gender = '男性' # 添加一个man1的私有变量print(Man.gender)# 类名.类变量名 可以修改类变量,对象.类变量名,不可以修改类变量Man.gender = '男性'print(Man.gender)print(man1.gender)
类方法
实例方法 与对象挂钩,随着对象的变化而变化,类方法,与之相反。类方法中不允许使用实例变量和实例方法。定义格式:
class 类名: @classmethod def 方法名(cls, 形参): 方法体
实例:
# 类方法中不允许使用实例变量和实例方法class Chinese: # 类变量,不随之对象的变化而变化 country = '中华人民共和国' def __init__(self,name,place): # 实例变量 self.name = name self.place = place # 定义一个类方法,保存在类空间中,优化内存空间 @classmethod def say_fighting(cls): print('我是中国人,我为中国加油!!!') # 定义实例方法 def myself(self): print('我是%s,来自%s' % (self.name,self.place))man1 = Chinese('张三','江苏')# 调用实例方法man1.myself()# 调用类方法Chinese.say_fighting()