Day09新手小白学python

第九节 Python的类和对象的介绍,定义类和对象,定义实例方法和属性以及Python中的魔法方法


目录


Day09新手小白学python

前言

一、面向对象介绍

二、类和对象的概念

三、定义类和对象

四、实例方法与属性

五、_init_方法

六、理解self

七、魔法方法

八、案例-决战紫禁之巅

 九、练习

总结



前言

本文介绍了Python的类和对象的介绍,定义类和对象,定义实例方法和属性以及Python中的魔法方法


一、面向对象介绍

面向对象编程:OOP  [object oriented programming],是一种python的编程思路。

面向过程:根据业务逻辑从上到下写代码。在思考问题的时候, 首先分析怎么按照步骤去实现,然后将问题解决拆解成若干个步骤,并将这些步骤对应成方法一步一步的,最终完成功能

函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可

面向对象编程:将数据与函数绑定到一起,进行封装,这样能够更快速的开发程序,减少了重复代码的重写过程,关注的是设计思维【找洗车店   给钱洗车】,面向对象适合做大项目

面向过程的关注点是: 怎么做        面向对象的关注点是: 谁来做

二、类和对象的概念

类和对象是面向对象编程中重要的概念

就是一个模板,模板里可以包含多个函数,函数里实现一些功能

对象则是根据模板创建的实例,通过实例对象可以执行类中的函数

类相当于制造汽车的图纸,用这个图纸制造的汽车相当于对象

类:类是具有一组 相同或者相似特征【属性】和行为【方法】的一系列[多个]对象组合

对象: 对象是实实在在的一个东西,类的实例化,具象化

类是对象的抽象化  而对象是类的一个实例

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

三、定义类和对象

定义类

类(Class)由3个部分构成

        类的名称: 类名

        类的属性: 一组数据

        类的方法: 允许对进行操作的方法 (行为)

创建对象

对象名 = 类名()

# 定义类和对象
# 类结构 类名  属性  方法
# class 类名:
#     属性
#     方法
class Person:
    '''
    对应人的特征
    '''
    name="小明"   # 类属性
    age=20   # 类属性
    '''
    对应人的行为
    '''
    def __init__(self):
        self.name1='小刘' #实例属性
        pass
    def eat(self):
        print("大口吃饭")
        pass
    def run(self):
        print("飞快的跑")
        pass
    pass

# 创建一个对象【类的实例化】
# 规则格式 对象名=类名()
xm=Person()
xm.eat() #调用函数  输出:大口吃饭
xm.run()        # 输出:飞快的跑
print("{}的年龄是:{}".format(xm.name,xm.age))   # 输出 小明的年龄是:20
print("{}的年龄是:{}".format(xm.name1,xm.age))   # 输出 小刘的年龄是:20
# 创建另外一个实例对象
xw=Person()
xw.eat()    # 实例方法

四、实例方法与属性

实例方法

在类的内部定义,使用 def 关键字来定义。第一个参数默认为 self,且为第一个参数【名字标识可以是其他的名字,但是这个位置必须被占用】,只在调用该方法的时候传参,定义类的时候不需要传参

实例方法是归于 类的实例所有

属性:类属性、实例属性

类里面定义的变量。定义在类里面,方法外面的属性称之为类属性,;定义在方法里面,用def _init_定义,通过类似于self.变量名来定义的,称之为实例属性,在要用实例属性时,直接用self.变量名即可。

五、_init_方法

__init__(self) 方法:初始化方法,实例化对象的时候自动调用,即定义该对象的时候会自动调用,所以在定义对象的时候就要给他传参,完成一些初始化设置。

class People:
    def __init__(self):
        '''
        实例属性
        '''

        self.name='小千'
        self.sex='女生'
        self.age=20
        pass

    def eat(self):
        '''
        吃的行为
        :return:
        '''
        print('喜欢吃榴莲')
    pass
xq=People()
xq.eat()
xq.name="小钱"    # 添加实例属性
xq.sex="女"   # 添加实例属性
xq.age=20    # 添加实例属性
print(xq.name,xq.sex,xq.age) # 输出:小钱 女 20

xl=People()
xl.name="小莫"    # 添加实例属性
xl.sex="男"   # 添加实例属性
xl.age=20    # 添加实例属性
print(xl.name,xl.sex,xl.age)

xm=People() # 在创建新对象时,是自动执行的 初始化方法
print(xm.name)  # 输出结果:小千  输出的是定义的默认值
xm.name="小李"
print(xm.name)   # 输出结果:小李

# 如果有n个这个对象被实例化 那么就需要添加很多次这样的属性 比较麻烦

__init__传参:考虑将属性当参数在实例化对象的时候传进去,让类更通用

# 改进:init 传递参数
class People:
    def __init__(self,name,sex,age):
        '''
        实例属性
        '''

        self.name=name
        self.sex=sex
        self.age=age
        pass

    def eat(self,food):    # 调用它的时候才会给他传递参数
        '''
        吃的行为
        :return:
        '''
        print(self.name+'喜欢吃'+food)    # 调用self.name 而不是name
    pass
zp=People('张鹏','男',18)    # 传入的参数是def _init_定义的参数
print(zp.name,zp.age)   # 输出:张鹏 18
zp.eat("香蕉")    # 输出: 张鹏喜欢吃香蕉

lh=People('小花','女',78)
print(lh.name,lh.age)   # 输出:小花 78
lh.eat('苹果')    # 输出:小花喜欢吃苹果

# 总结:_init_
# 1、Python自带的内置函数, 使用双下划线包起来,也称为【魔术方法】
# 2、是一个初始化的方法,用来定义实例属性和初始化数据的,在创建对象的时候自动调用的,不用手动调用
# 3、利用传参的机制可以让我们定义功能更加强大方便

六、理解self

self和对象指向同一个内存地址,可以认为self就是对象的引用。

self传参问题所谓的self,可以理解为对象自己,某个对象调用其方法时,python解释器会把这个对象作为第一个参数传递给self,所以开发者只需要传递后面的参数即可。self的名称是可以更改的,可以定义成其他的名字,只是约定俗成定义成了self

class Person:
    def __init__(self,pro):
        '''

        :param pro:专业
        '''
        self.pro=pro    # 实例属性的定义
        pass
    '''
    定义类
    '''
    def eat(a,name,food):
        '''
        实例方法
        :return:
        '''
        # print('self=%s'%(id(self)))
        print('%s 喜欢吃 %s 专业是:%s' %(name,food,a.pro))
        pass
    pass
# xw是一个新的实例化对象
xw=Person('心理学')    # 实例属性需要在定义时传参,因为def _init_在实例化对象的时候会自动调用,所以必须传递参数
print('xw=%s'%(id(xw)))   # 输出结果是:xw=2392804216784
xw.eat('小王','榴莲')        # 实例方法在调用该方法时传参即可 输出结果是:小王 喜欢吃 榴莲 专业是:心理学

# 小结 self特点
# self只有在类中 定义实例方法的时候才有意义,在调用时不必传入相应参数,而是由解释器自动去指向调用的对象
# self的名称是可以更改的,可以定义成其他的名字,只是约定俗成定义成了self
# self 指的是 类实例对象本身

七、魔法方法

在python中,有一些内置好的特定的方法,方法名是“__xxx__”,在进行特定的操作时会自动被调用,这些方法称之为魔法方法。

几种常见的魔法方法。

        __init__方法:初始化一个类,在创建实例对象为其赋值时使用。

        __str__方法:在将对象转换成字符串  str(对象)  测试的时候,打印对象的信息。

class Person:
    def __init__(self,pro,name,food):
        '''
        :param pro:专业
        :param name:名字
        :param food:食物
        '''
        self.pro=pro    # 实例属性的定义
        self.name=name
        self.food=food
        pass

    def __str__(self):
        '''
        打印对象,自定义对象,是内容格式的
        :return:
        '''
        return '%s 喜欢吃 %s 专业是:%s' %(self.name,self.food,self.pro)
    pass
# xw是一个新的实例化对象
xw=Person('心理学','小王','榴莲')
print(xw)   # 没加时输出地址,加了def __str__(self):之后,直接输出对象,输出结果为:小王 喜欢吃 榴莲 专业是:心理学

        __new__方法:真正创建并返回一个实例对象,调用了一次,就会得到一个对象。定义完执行时,先执行new创建当前实例对象,有了当前类再执行init进行初始化,__new__方法必须要返回当前创建的实例对象,否则对象创建不成功

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 __str__(self):
        '''
        打印对象,自定义对象,是内容格式的
        :return:
        '''
        return '%s 喜欢吃 %s 专业是:%s' %(self.name,self.food,self.pro)
    def __new__(cls, *args, **kwargs):
        '''
        创建对象实例的方法 每调用一次 就会生成一个新的对象 cls就是class的缩写
        场景:可以控制创建对象的一些属性限定 经常用来做单例模式的时候来使用
        :param args:
        :param kwargs:
        :return:
        '''
        print("-----new----函数执行")
        return object.__new__(cls)  # 在这里是真正创建对象实例的,该语句创建对象实例并返回当前对象实例,先执行new创建当前类,有了当前类再执行init
    pass
# xw是一个新的实例化对象
xw=Person('心理学','小王','榴莲')
print(xw)   # 没加时输出地址,加了def __str__(self):之后,直接输出对象,输出结果为:小王 喜欢吃 榴莲 专业是:心理学


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

        __class__方法:获得已知对象的类 ( 对象.__class__)。

        __del__方法:对象在程序运行结束后进行对象销毁的时候调用这个方法,来释放资源。

八、案例-决战紫禁之巅

决战紫禁之巅有两个人物,西门吹雪以及叶孤城

        属性:

                name 玩家的名字

                blood 玩家血量

        方法:

                tong() 捅对方一刀,对方掉血10滴

                kanren() 砍对方一刀,对方掉血15滴     

                chiyao() 吃一颗药,补血10滴

                __str__ 打印玩家状态。

# 第一步 需要先定义一个类【角色类】
import time # 导入时间的包
class Role:
    def __init__(self,name,hp):
        '''
        构造初始化函数
        :param name: 名字
        :param hp: 血量
        '''
        self.name=name
        self.hp=hp
        pass
    def tong(self,enemy):
        '''
        捅一刀
        :param enemy:敌人
        :return:
        '''
        # 敌人减掉10滴血
        enemy.hp-=10
        info="【%s】捅了【%s】一刀"%(self.name,enemy.name)
        print(info)
        pass
    def kanren(self,enemy):
        '''
        砍人
        :param enemy: 敌人
        :return:
        '''
        # 敌人减掉15滴血
        enemy.hp-=15
        info="【%s】砍了【%s】一刀"%(self.name,enemy.name)
        print(info)
        pass
    def chiyao(self):
        '''
        吃药补血
        :return:
        '''
        self.hp+=15
        info="【%s】吃了一颗补血药增加了10滴血"%(self.name)
        print(info)
        pass
    def __str__(self):
        return "%s 还剩 %s 的血量"%(self.name,self.hp)
    pass
# 第二步 创建两个实例化对象【西门吹雪,叶孤城】
xmcx=Role('西门吹雪',100)
ygc=Role('叶孤城',100)
while True:
    if xmcx.hp<=0 or ygc.hp<=0:
        # 满足条件退出循环
        break
    xmcx.tong(ygc)  #西门吹雪捅了叶孤城
    print(ygc)  # 打印状态
    print(xmcx)
    print("*************************************")
    ygc.kanren(xmcx)
    print(ygc)  # 打印状态
    print(xmcx)
    print("*************************************")
    xmcx.chiyao()
    print(ygc)  # 打印状态
    print(xmcx)
    time.sleep(1)   # 休眠暂停1s
print("对战结束")

 九、练习

1、python中如何通过类创建对象,请用代码举例说明。如何在类中定义一个方法,请用代码举例说明。

class Person:
    name="小李"   # 类属性
    def __init__(self,hobby):
        self.pro="自动化"      # 实例属性
        self.age=20
        self.hobby=hobby
        pass
    def run(self,time):     # 实例方法
        print("跑一千米花%s" %time)
        pass
    def eat(self):
        print("最喜欢干饭")
        pass
zx=Person("打球")     # __init__ 传参
print(zx.name,zx.pro,zx.age,zx.hobby)
zx.run("四分")
zx.pro="测控"
zx.age=34
print(zx.name,zx.pro,zx.age,zx.hobby)

 2、定义一个水果类,然后通过水果类,创建苹果对象、橘子对象、西瓜对象并分别添加上颜色属性

class Fruit:
    def __init__(self,name,color):
        self.name=name
        self.color=color
        print("我是%s,我是%s的" %(self.name,self.color))
        pass
    pass
pg=Fruit("苹果","红色")
jz=Fruit("橘子","橙色")
xg=Fruit("西瓜","绿色")

 3、请编写代码,验证self就是实例本身。

class yanzheng:
    def __init__(self,name,color):
        self.name=name
        self.color=color
        print("我是%s,我是%s的" %(self.name,self.color))
        print("我是__init__中的self,我的地址是%s" %id(self))
    pass
    def like(self,YN):
        print(YN)
        print("我是实例方法中的self,我的地址是%s" % id(self))
        pass
    pass
pg=yanzheng("苹果","红色")
pg.like("不好吃")
print("我是对象,我的地址是%s" %id(pg))

 4、定义一个Animal类

(1)、使用__init__初始化方法为对象添加初始属性。如颜色,名字,年龄。

(2)、定义动物方法,如run,eat等方法。如调用eat方法时打印xx在吃东西就可以。

(3)、定义一个__str__方法,输出对象的所有属性。

class Animal:
    def __init__(self,name,color,age):
        self.name=name
        self.color=color
        self.age=age
        pass
    def run(self,speed):
        print("跑的{}".format(speed))
        pass
    def eat(self,shiwu):
        print("最喜欢吃{}".format(shiwu))
        pass
    def __str__(self):
        return "%s是%s的,%s" %(self.name,self.color,self.age)
    pass
xiugou=Animal("小狗","黑白花","三个月")
print(xiugou)
xiugou.run("一般快")
xiugou.eat("狗粮")
rabbit=Animal("兔子","白色","一岁")
print(rabbit)
rabbit.run("最快")
rabbit.eat("胡萝卜")

总结

本文仅仅简单介绍了Python的类和对象的介绍,定义类和对象,定义实例方法和属性以及Python中的魔法方法