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()