7. 面向对象基础

 面向过程、面向对象

面向过程
  • 根据业务逻辑从上到下写代码
  • 就是我们一开始学习的,按照解决问题的步骤去写代码【根据业务逻辑】-------在思考问题的时候,首先分析“怎么按照步骤去实现”,然后将问题解决拆解成若干个步骤,并将这些步骤对应的方法一步一步实现,最终完成功能
  • 怎么做【洗车:洗车的一系列步骤】
  • 不足:没有更多的时间精力去考虑其他的事,面向过程不适合做大项目
面向对象
  • oop(object oriented programing): 是一种python的编程思想,关注的是设计的思维
  • 谁来做【洗车:找洗车店 给钱洗车】
  • 面向对象适合做更大的项目

类、对象

类:是具有一组相同或者相 特征(属性)和行为(方法)的一系列对象。也就是一个模板,在模板里可以包含多个函数,函数里实现一些功能。

现实世界计算机世界
行为方法
特征属性

对象:是实实在在存在的一个东西,类的实例化(具象化)根据模板创建的实例,通过实例对象可以执行类中的函数。

  • 类是对象的抽象化,对象是类的实例化
  • 类相当于制造汽车的图纸,图纸制造的汽车相当于对象
  • 类的组成结构:类名、类的属性、类的方法  

定义类和对象

  • 实例方法:在【类的内部】,使用def 关键字可以定义一个实例方法,第一个参数是self          
  • 与一般函数定义不同,类方法必须包含参数self(是一个关键字,是什么无所谓,但是必须要有), 如:类Person中的eat和run.
  • 类的方法归于类的实例所有
  • 类属性:在类里面、方法外面的属性
  • 类属性是大部分共有的属性,比如猫毛。但可能有特殊部分和属性不同,比如无毛猫,就不能用类属性,需要实例属性
  • 实例属性:在方法内部定义的【通过类似于self.变量名】引用的属性称之为实例属性
  • 有实例方法就会有实例属性,实例属性归属于实例方法【_init_函数】
class Person:   #类名--首字母建议大写
    '''
    类的属性: 对应人的特征
    '''
    name='小明'        #类属性
    age=20          #类属性
    '''
    类的方法【实例方法】: 对应人的行为    
    '''
    def __init__(self):
        self.height=187         #height是实例属性,和类属性不要重名
        pass

    def eat(self):   #行为
        print("大口的吃饭")   
        pass
    def run(self):
        print("飞快的跑")        #实例方法
        pass
xm=Person()        #创建一个对象:小明
xm.eat()         # 调用实例方法(类的行为)
xm.run()
print('{}的年龄是{},身高是{}'.format(xm.name,xm.age,xm.height))     #访问类的属性

魔术方法:__init__方法

__init__方法是一个初始化方法,实例化对象的时候自动调用,完成一些初始化设置。

class People():         #定义一个简单的类,没有定义类属性
    def __init__(self,name,sex,age):      #括号中的参数信息在创建对象的时候给出
        self.name=name    #实例属性的初始值 成为一个参数
        self.sex=sex
        self.age=age
        pass
    '''
    实例方法:吃的行为
    '''
    def eat(self,food):    #self相当于创建的实例对象本身,food参数需要在调用eat函数时给出
        print(self.name+'喜欢吃'+food)
       #print('{}喜欢吃{}'.format(self.name,food))
    pass

zp=People('张鹏','男',19)       #创建对象zp,并给出实例属性中参数需要的数据
print(zp.name,zp.age,zp.sex)    #打印对象zp的属性
zp.eat('香蕉')                  #调用实例方法,此时需要给出实例方法eat的参数food的数据--香蕉

lh=People('李辉','男',27)
print(lh.name,lh.age,lh.sex)
lh.eat('橘子')

xh=People('小花','女',38)
print(xh.name,xh.age,xh.sex)
xh.eat('榴莲')

总结【__init__方法】:

  • python自带的内置函数  具有特殊的函数 使用双下划线包起来的魔术方法
  • 是一种初始化方法,主要用来定义一些 实例属性和初始化数据的,在创建对象时自动调用的,不需要手动调用
  • 利用其传参的机制,可以让我们的定义功能更加强大并且方便 

 self 理解

  • self和对象是同一个内存地址,可以认为self就是对象的引用----self代表的就是实例对象本身
class Person:
    def __init__(self,pro):   #有两个参数,第二个参数在 对象创建时给出
        self.pro=pro      #实例属性的定义
        pass
    def eat(self,name,food):    #可以是self,也可以是其他
        # print('self=%s'%id(self))
        print('%s喜欢吃%s,专业是%s'%(name,food,self.pro))
        pass
    pass
xm=Person('心理学')    #创建实例对象,参数是 _init_ 里的参数
#print('对象xm的地址{}'.format(id(xm)))
# 实例方法中self的内存地址 = 实例对象的内存地址
# self代表的就是实例对象本身,
xm.eat('小王','榴莲')    #如果定义的实例方法中只有self一个参数时,调用时不需要传递任何参数的(self代表的就是对象),直接调用即可

 小结【self特点】:

  • self只有在类中定义实例方法的时候才有意义,在调用的时候不必传入相应参数,而是由解释器自动指向所创建的对象
  • self的名称是可以更改的,可以定义成其他的名字,只是约定俗成的定义成了 self
  • self指的是 类实例对象本身,相当于java中的this

 魔术方法:__str__方法

如果没有使用 __str__方法,我们直接打印对象,输出结果只是遗传类似id地址的信息,例如打印对象xm:

print(xm)   #输出<__main__.Person object at 0x000001B355BFD180>

 使用 __str__方法,可以输出具体的内容,使用方法如下【具体看以下】:

# 在类中作为实例方法使用
def __str__(self):  
    return '%s喜欢吃%s,专业是%s'%(self.name,self.food,self.pro)
pass

#必须要有return

魔术方法:__new__方法

new魔法方法中,如果类中使用:

    def __new__(cls, *args, **kwargs):
        print('----new函数执行-----')
        #不写 return object.__new__(cls)

#输出:
----new函数执行-----      #执行了new函数
None           #但没有执行init函数,说明对象没有创建成功

完整代码:

class Person:
    def __init__(self,pro,name,food):   #有两个参数,第二个参数在 对象创建时给出
        '''

        :param pro:专业
        :param name: 姓名
        :param food: 食物
        '''
        self.pro=pro      #实例属性的定义
        self.name=name
        self.food=food
        print('------init函数执行----')
        pass
    '''
    定义类
    '''

    def eat(self):    #可以是self,也可以是其他
        '''
        实例方法
        :return:
        '''
        # print('self=%s'%id(self))
        print('%s喜欢吃%s,专业是%s'%(self.name,self.food,self.pro))
        pass
    def __str__(self):   #魔术方法:直接输出对象的时候可以输出内容,不是地址
        '''
        打印对象   自定义对象   是内容格式的,并非内存地址格式
        :return:
        '''
        return '%s喜欢吃%s,专业是%s'%(self.name,self.food,self.pro)
    pass
    def __new__(cls, *args, **kwargs):
        '''
        创建对象实例的方法 每调用一次就会生成一个新的对象 cls就是class的缩写

        场景:可以控制创建对象的一些属性限定 经常用来做单例模式的时候来使用
        :param args:
        :param kwargs:
        '''
        print('----new函数执行-----')
        return object.__new__(cls)   #创建一个对象(cls类中),并且返回给init函数中【必须有return】
xm=Person('心理学','小明','榴莲')    #创建实例对象,参数是 _init_ 里的参数
print(xm)     #直接输出对象(内容格式)。如果没有_str_实例方法,直接输出的就是地址

#输出:
----new函数执行-----
------init函数执行----
小明喜欢吃榴莲,专业是心理学

 __new__和 __init__函数的区别

  • __new__  类的实例化方法:必须要返回该实例,否则对象创建不成功
  • __init__ 用来做数据属性的初始化工作 也可以认为是实例的构造方式 接收类的实例 self 并对其进行构造
  • __new__ 至少要有一个参数是 cls 代表要实例化的类,此参数实例化时由python解释器自动提供,不需要认为给
  • __new__ 函数执行要早于__init__函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值