2021小白Python学习记录Day7 面向对象基础(上) (定义类和对象、__init__传参、self、魔术方法)

目录

一、定义类和对象

1.定义类

2.创建一个对象

2.1 创建一个实例对象并调用实例方法

2.2 创建另一个实例对象:

2.3 添加实例属性

二、__init__(self)

1. __init__(self) 声明多个实例属性

2.__init__传参        改进

3 __init__总结

三、self

四、魔术方法:

__new__和__init__区别

其他魔术方法简单介绍


'''

面向对象编程:oop[object oriented programming] 是一种python编程思路

面向过程:就是我们一开始学习的,按照解决问题的步骤取写代码【根据业务逻辑去写代码】
在思考问题的时候,首先分析‘怎么按步骤去实现’,然后将问题解决拆解为若个个步骤,并将这些步骤对应成方法一部一部的最终完成功能【按步骤洗车】

面向对象:关注的是设计思维【找洗车店 给钱洗车】

从计算机角度来看:面向过程不适合做大项目,而面向对象适合做更大项目的设计

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

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

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

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

实例方法:在类的内部,用def 关键字定义 第一个参数默认是self【名字标识可以是其他的名字,但是这个位置必须被占用】
实例方法是归于类的实例所有

属性:定义在类内方法外的变量称为【类属性】 
在方法内部定义的【通过使用类似于self.变量名】变量 称为实例属性

'''


一、定义类和对象

1.定义类

(类结构 类名 属性 方法)

class 类名:
    属性
    方法

class Person:      # 类名一般用大驼峰命名法
    '''
    对应人的特征
    '''
    name='小明'          #类属性
    age=20            
    '''
    对应人的行为
    '''
    def __init__(self):    #   __魔术方法__
        self.name1='小明1'   #  实例属性
        pass
    def eat(self): #实例方法:归实例所有   
    # 第一个参数默认是self【名字标识可以是其他的名字,但是这个位置必须被占用】
        print('大口的吃饭')
        pass
    def run(self):         #实例方法
        print('飞速的跑')
        pass
    pass

注意第一个参数默认是self【名字标识可以是其他的名字,但是这个位置必须被占用】

2.创建一个对象

2.1 创建一个实例对象并调用实例方法

# 创建一个对象【类的实例化】
# 规则格式 对象=类名()
xm=Person()
xm.eat()    #调用函数
xm.run()
print("{}的年龄是:{}".format(xm.name,xm.age))      #小明的年龄是:20
print("{}的年龄是:{}".format(xm.name1,xm.age))      #小明1的年龄是:20

运行结果:

2.2 创建另一个实例对象:

# 创建另一个实例对象
xw=Person()              #创建出来的
xw.eat()                 #实例方法

2.3 添加实例属性

# 添加实例属性
xw.sex='男'             # 添加实例属性 属于实例私有的属性
xw.pro='生物信息'             # 添加实例属性 属于实例私有的属性
print(xw.sex)

运行结果:

# 如果有n个这样的对象被实例化 那么就需要添加很多次实例属性了 显然比较麻烦
# 引出 __init__(self)

二、__init__(self)

1. __init__(self) 声明多个实例属性

class People:
    def __init__(self):   # 默认被调用   #__方法名__ 为内置魔术方法
        '''
        实例属性的声明和初始化
        '''
        self.name='小倩'   # 实例属性初始化
        self.sex='女'
        self.age='18'
        pass
    def eat(self):         # 实例属性
        '''
        吃的行为
        :return:
        '''
        print('喜欢吃猕猴挑')
        pass
    pass

xq=People()    #此时xq已经拥有name,sex,age三种实例属性了
print(xq.name,xq.sex,xq.age)
xq.name='大倩'
xq.sex='女'
xq.age='19'
print(xq.name,xq.sex,xq.age)

运行结果:

2.__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)
        pass
    pass
zhangheng=People('张衡','男',22)
print(zhangheng.name,zhangheng.age)    # 张衡  22

lh=People('李辉','男',18)
print(lh.name,lh.age)                 #李辉 18
lh.eat('苹果')                      #李辉喜欢吃苹果
zhangheng.eat('饺子')            #张衡喜欢吃饺子

 运行结果:

3 __init__总结

1.Python 自带的内置函数 具有特殊的函数 使用双下划线包起来的【魔术方法】

2.是一个初始化的方法,用来定义实例属性 和初始化数据的,在创建对象的时候自动调用 不用手动去调用

3.利用传参的机制可以让我们定义功能更加强大并且方便的 类

三、self

# self
class PersonB:
    '''
    定义类
    '''

    def getSelf(self):       #python解释器会自动把这个实例对象作为第一个参数传递给self
        print('self=%s'%id(self))
        pass
    def eat(self,name,food):
        print('%s喜欢吃%s,职业是%s'%(name,food,self.pro))
        pass
    def __init__(self,pro):
        '''

        :param pro: 专业
        '''
        self.pro=pro       # 实例属性的定义
        pass

# ld是一个新的实例化对象
ld=PersonB('生信')
ld.getSelf()
print('ld=%s'%id(ld))  # self与实例对象ld  内存地址相同
ld.eat('罗滴','水果')     # 罗滴喜欢吃水果

运行结果:

python解释器会自动把实例对象作为第一个参数传递给self,可以通过后面两者内存地址相同可知,self即是ld这个实例对象的引用。

self总结:

self只有在定义 实例方法的时候才有意义,在调用不必传入相应参数,由解释器 自动去指向

self的名字是可以更改的 可以定义成其他的名字,只是约定俗成的定义成self

self 指的是 类实例对象本身,相当于java中的this关键字

四、魔术方法:

类似 __str__   __new__  都是python内置的魔术方法

# 魔术方法
# __str__
# __new__
class People:
    def __init__(self,name,age,food):  # 默认被调用   #__方法名__ 为内置魔术方法
        '''

        :param name: 名字
        :param age: 年龄
        :param food: 食物
        '''
        self.name=name   # 实例属性初始化
        self.age=age
        self.food=food
        #测试
        print('-------------init执行---------')
        pass
    def __str__(self):
        '''
        打印对象 自定义对象内容格式的
        :return:
        '''
        return '%s今年%d喜欢吃%s'%(self.name,self.age,self.food)
    def __new__(cls, *args, **kwargs):                     # 不写会自动补一个new
        '''
        创建对象实例的方法  每调用一次 就会生成一个新的对象 cls 就是class的缩写
        场景: 可以控制创建对象的一些属性,经常用来做单例模式的时候来使用
        :param args:
        :param kwargs:
        '''
        # 测试
        print('=============new执行==========')
        return object.__new__(cls)      # 在这里是真正创建对象实例的
    pass
zhh=People('张衡',22,'汉堡')
print(zhh)    # 张衡今年22喜欢吃汉堡           # 没有__str__会只输出地址  先new对象才能init
 

__new__和__init__区别

 __new__ 类的实例化方法 必须要返回(return)该实例 否则对象就创建不成功

 __init__ 用来做实例属性的初始化操作 也可以认为是实例的构造方法 接受类的实例 self 并对其进行构造

 __new__ 至少有一个参数 是cls 代表要实例化的类, 此参数在实例化时由python解释器自动提供

 __new__ 函数要先于__init__函数 执行

其他魔术方法简单介绍

__str__ 自定义对象内容格式的 打印对象 没有__str__会只输出地址 必须return
__class__ 查看对象所在的类
__del__ 析构方法 不写会自动补一个del
__mro__ 方法解析顺序  
__call__将实例对象以函数的形式调用

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿左.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值