面向对象编程


面向对象编程的思想主要是针对大型软件设计而来的,使得程序的扩展性更强、可读性更好。它将数据和操作数据相关的方法封装到对象中,组织代码和数据的方式更加接近人的思维,从而大大提高了编程的效果。
python完全采用了面向对象的思想,支持面向过程、面向对象、函数式编程等多种编程范式。

面向对象和面向过程

其中面向对象和面向过程都是解决问题的思维方式,是代码组织的方式。但是面向对象更加关注“软件中对象之间的关系”,适合编辑大规模程序。面向过程更加关注“程序的逻辑流程”,适合编写小规模程序。

对象的进化

随着编程面临的问题越来越复杂,编程语言本身也在进化,从主要处理简单数据开始,数据多进化为“数组”;数据类型变得复杂,进化出了“结构体”;处理方式和逻辑也变得复杂,进化出了“对象”。
对象是类的具体实例,一般称为“类的实例”。从一个类创建对象时,每个对象会共享这个类的行为(类中定义的方法),但会有自己的属性值(不共享状态)。即“方法代码是共享的,属性数据不共享”。

类的定义

代码由类组合,如果将对象比作饼干,类就是饼干的模具,对象是类的具体实体。
在这里插入图片描述
通过类定义数据类型的属性(数据)和方法(行为)。
在这里插入图片描述
在python中,类称为“类对象”,类的实例称为“实例对象”
语法格式:
class 类型:
 类体

注意事项:

  1. 类名必须符合“标识符”的规则:一般规定首字母大写,多个单词使用“驼峰原则”
  2. 类体中可以定义属性的方法
  3. 属性用来描述数据,方法(函数)表述数据的相关操作

构造函数 init()

类是抽象的,也称为“对象的模板”。通过类这个模板,创建类的实例对象,然后使用类定义这个功能。
创建对象,使用构造函数方法:__int__方法,构建方法用于执行“实例对象的初始化工作”,即对象创建后,初始化当前对象的相关属性,无返回值。
注意事项:

  1. 名字固定,必须为__int__()
  2. 第一个参数必须为self
  3. 构造函数通常用来初始化实例对象的实例属性
  4. 通过类名(参数列表)来调用构造函数,调用后,将创建好的对象返回给相应的变量。
  5. __int__():初始化创建好的对象
  6. _new_():用于创建对象,一般无需重定义该方法
// An highlighted block
'''一个典型的类的定义'''
class Student:
    def __init__(self, name, score):  # 构造方法第一个参数必须为self
        self.name = name           #实例属性
        self.score = score

    def say_score(self):           #实例方法
        print(self.name,"的分数是:",self.score)


s1 = Student("一个小白的日常",80)    #调用构造函数,无返回值
s1.say_score()

在这里插入图片描述

实例对象

实例属性

从属于实例对象的属性,称为“实例变量”。

  1. 实例属性一般在__int__()方法中通过一下方法定义:
       self.实例属性名=初始值
  2. 在本类的其他实例方法中,也是通过self进行访问:
       self.实例属性名
  3. 创建实例对象后,通过实例对象访问:
       obj01=类名() #创建对象,调用__int__()初始化属性
       obj01.实例属性名=值 #可以给已有属性赋值,也可以新加属性
实例方法

从属于实例对象的方法
定义格式:
def 方法名(self [.形参列表])
 函数体

方法的调用格式:
对象.方法名([实参列表])

// An highlighted block
'''实例属性测试'''
class Student:  # 类名一般首字母大写,多个单词采用驼峰原则

    def __init__(self, name, score):  # 实例属性
        self.name = name
        self.score = score

    def say_score(self):            #实例方法
        print("{0}的分数是: {1}".format(self.name, self.score))


s1 = Student("一个小白的日常",80)    #调用构造函数,无返回值
s1.say_score()              #调用第二个def

在这里插入图片描述

类对象

在类的定义格式中,“calss 类型:”,当执行calss语句时,就会创建一个类对象。

// An highlighted block
'''测试类对象的生成'''
class Student():              #生成类对象
    pass

print(type(Student))
print(id(Student))

Stu2=Student             #将Student的地址给了Stu2
s1=Stu2()
print(s1)

s1=Student()
print(s1)

在这里插入图片描述

类属性

从属于类对象的属性,也称为“类变量”。由于类属性从属于类变量,可被所有实例对象共享。
定义方式:
class 类名:
 类变量名=初始值

// An highlighted block
'''类属性的使用测试'''
class Student:
    company="ABC"           #类属性
    count=0                 #类属性

    def __init__(self,name,score):
        self.name=name                #实例属性
        self.score=score
        Student.count=Student.count+1

    def say_score(self):               #实例方法
        print("我的公司是:",Student.company)
        print(self.name,'的分数是:',self.score)

s1=Student('一个小白的日常',24)          #s1是实例对象,自动调用__init__()方法
s1.say_score()
print('一共创建{0}个Student对象'.format(Student.count))

在这里插入图片描述

类方法

从属于类对象的方法,类方法通过装饰器@classmethod来定义
定义方式:
@classmethod
def 类方法名(cls [,形参列表])
 函数体

注意事项:

  1. @classmethod必须位于方法上面一行
  2. 第一个cls必须有:cls指的就是“类对象”本身
  3. 调用类方法格式:“类名.类方法名(参数列表)”。参数列表中,不需要也不能给cls传值。
  4. 类方法中访问实例属性和实例方法会导致错误
  5. 子类继承父类方法时,传入cls是子类对象,而非父类对象
// An highlighted block
'''类方法使用测试'''
class Student:
    company="ABC"    #类属性
    @classmethod
    def printCompany(cls):
        print(cls.company)

Student.printCompany()

在这里插入图片描述

静态方法

python中允许定义与“类对象”无关的方法,称为“静态方法”
“静态方法”和在模块中定义普通函数没有区别,只不过“静态方法”放到了“类的名字空间里面”,需要通过“类调用”。
静态方法通过装饰器@staticmenthod来定义
定义方式:
@staticmenthod
def 类方法名(cls [,形参列表])
 函数体

注意事项:

1.@staticmenthod必须位于方法上面一行
2. 调用静态方法格式:“类名.静态方法名(参数列表)”
3. 静态方法中访问实例属性和实例方法会导致错误

// An highlighted block
'''静态方法使用测试'''
class Student:
    company="ABC"    #类属性

    @staticmethod
    def add(a,b):           #静态方法
        print("{0}+{1}={2}".format(a,b,(a+b)))
        return a+b

Student.add(20,30)

在这里插入图片描述

__del__方法(析构函数)和垃圾回收机制

用于实现对象被销毁时所需的操作。python实现自动的垃圾回收,当对象没有被引用时(引用计数为0),由垃圾回收器调用_del_方法。系统会自动提供__del__方法,一般不需要自定义析构方法。

// An highlighted block
'''析构函数'''
class Person:

    def __del__(self):
        print("销毁对象:{0}".format(self))

p1=Person()
p2=Person()
del p2            #销毁p2
print("程序结束")   #程序执行完后,p1也会被销毁
print(p1)
print(p2)

在这里插入图片描述

__call__方法和可调用对象

定义了__call__方法的对象,称为“可调用对象”,即可以像函数一样被调用。

// An highlighted block
'''可调用对象'''
class SalaryAccount:

    def __call__(self,salary):
        yearSalary=salary*12
        daySalary=salary//22.5
        hourSalary=daySalary//8

        return dict(yearSalary=yearSalary,monthSalary=salary,daySalary=daySalary,hourSalary=hourSalary)

s=SalaryAccount()
print(s(5000))

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值