python之初识面向对象

1、面向过程的编程思想
1.1、编程思想的定义
编程思想就是编写程序的套路,与具体的技术点无关
1.2、面向过程的定义及优缺点
核心是过程二字,过程就是解决问题的步骤,也就是先干什么、再干什么、后干什么
过程的终极奥义就是将程序流程化
过程是"流水线",用来分步骤解决问题的
基于该思想编写程序就好比在涉及一条条的流水线

优点:复杂的问题流程化、进而变得简单化
缺点:所有环节耦合到一起,环环相扣,如果要修改某个环节,有可能会牵一发而动全身,扩展性差
2、什么是面向对象编程
2.1、面向对象编程的定义及优缺点
核心是对象二字,对象就是一个用来盛放相关数据与相关功能的容器
对象的终极奥义就是将程序"整合"
对象是"容器",用来盛放数据与功能的
类也是"容器",该容器用来存放同类对象共有的数据与功能
程序=数据+功能

优点:程序解耦合强,扩展性高
缺点:比面向过程更复杂
2.2、定义类
类是对象相似数据与功能的集合体,定义类申请内存空间,把对象之间相同的数据与功能存起来
所以类体中最常见的是变量与函数的定义,但是类体其实是可以包含任意其他代码的
注意:类体代码是在类定义阶段就会立即执行,会产生类的名称空间

class Dog:
    name = '小白'

    def say(self):
        print('我的名字是<%s>' % (self.name))

    print('我会执行') # 在没有调用类时也会执行
 
print(Dog.__dict__)

属性访问的语法
类属性操作:类与对象都可以通过.来访问属性完成增删改查的操作
1、访问数据属性
print(Dog.name) # Dog.__dict__['name']

访问类的函数属性:它就是一个普通函数,该传几个参数就传几个参数,没有自动传参的说法
2、访问函数属性
print(Dog.say) # Dog.__dict__['say']   <function Dog.say at 0x00000184D63ACD08>
# 为当前类添加一个x的属性
Dog.x = 1111  # 相当于Dog.__dict__['x'] = 111,使用Dog.__dict__['x']=111会报错
print(Dog.__dict__)
2.3、调用类产生对象
调用类来产生对象,调用类的过程又称之为实例化
调用类的本质:就是产生一个与类相关联子空间

dog1_obj = Dog()
dog2_obj = Dog()
dog3_obj = Dog()
print(dog1_obj.__dict__) # {}
print(dog2_obj.__dict__) # {}
print(dog3_obj.__dict__) # {}

为对象定制自己独有的属性
dog1_obj.color = 'black'
print(dog1_obj.__dict__) # {'color': 'black'}

对象属性操作:对象.属性,会先从对象自己的空间里找,没有话去类中找
类中的定义的数据属性为了给对象用的,而且所有对象共享的,大家访问的都是同一个地址
print(id(Dog.name)) # 1623791477224
print(id(dog1_obj.name)) # 1623791477224
print(id(dog2_obj.name)) # 1623791477224
print(id(dog3_obj.name)) # 1623791477224

修改类的数据属性,所有对象都会跟着改
Dog.name = '小黑'
print(dog1_obj.name) # 小黑
print(dog2_obj.name) # 小黑
print(dog3_obj.name) # 小黑

修改对象的数据属性,只会当前对象的属性跟着改
dog1_obj.name = '小黑'
print(Dog.name) # 小白
print(dog1_obj.name) # 小黑
print(dog2_obj.name) # 小白
print(dog3_obj.name) # 小白

类中的定义的函数属性,类可以调用但就是一个普通函数,而类中函数通常都是为对象准备的,也就是说是给对象用的,如何给对象用?
需要绑定给对象
dog1_obj.say()
Dog.say(dog1_obj)

dog2_obj.say()
Dog.say(dog2_obj)

dog3_obj.say()
Dog.say(dog3_obj)
2.4、__init__的使用
class Person:
    def __init__(self,name,age,gender):
        self.name = name
        self.age = age
        self.gender = gender
        # 该函数内可以有任意代码,但是该函数不能返回非None值

    def running(self):
        print('%s正在跑步' % self.name)

obj1 = Person('allen',18,'male') # Person.__init__(空对象,'allen',18,'male')
obj2 = Person('lily',20,'female') # Person.__init__(空对象,'lily',20,'female')
print(obj1.running) # <bound method Person.running of <__main__.Person object at 0x000001F92F4A22B0>>
print(obj2.running) # <bound method Person.running of <__main__.Person object at 0x000001F92F4A2358>>

调用类的过程又称之为实例化,发生了三件事
1、先产生一个空对象
2、python会自动调用类中的__init__方法然将空对象已经调用类时括号内传入的参数一同传给__init__方法
3、返回初始完的对象
2.5、__init__的总结
1、会在调用类时自动触发执行,用来为对象初始化自己独有的数据
2、__init__内应该存放是为对象初始化属性的功能,但是是可以存放任意其他代码,想要在类调用时就立刻执行的代码都可以放到该方法内
3、__init__方法必须返回None
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值