python面向对象编程

一、介绍

面向对象编程(英语:Object-oriented programming,缩写:OOP)是一种编程理念,这种编程理念更符合我们人的逻辑思维。使用面向对象编程可以提高我们的开发速度和代码的重用率。面向对象的开发非常适合大型程序开发,开发速度和后期维护都比过程化开发要好很多。

二、面向对象和面向过程理解

面向过程和面向对象都是用来解决问题的,只是解决问题的思路不同。
面向过程可以理解为亲力亲力,面向对象可以理解为坐享其成。

面向过程:
1、菜市场买菜,2、讨价还价,3、洗菜,4、切菜,5、炒菜,6、吃

面向对象:
1、点开APP,2、下订单,3、吃

面向过程:
在生活中就是亲力亲为,在程序中面向过程编程就是函数之间的一个相互调用。以函数为基本结构使用。

面向对象:
在生活中是坐享其成,别人做好的东西为我所用。在程序中面向对象编程是以对象为基本结构使用。

三、对象和类的相关概念

1、类

生活中的类和对象概念
类:是对一群具有相同特征或者行为的事物的统称,是抽象的,不能直接使用。
例如人类狗类猫类…
描述一个类通过行为和特征
行为:会跑,会叫
特征:黄毛,大眼睛
类可以理解为一种事物的模板

2、对象

对象:
是由类创造出来的具体实体,可以直接使用的。例如大黄,小白。

在这里插入图片描述
如上图所示,人类就是类,而小布什,普京等就是对象。

3、类和对象之间的关系

  1. 先有类后有对象
  2. 类只有一个对象可以有多个

4、类的设计

在程序中设计一个类,通常需要满足一下3个要素:
类名:大驼峰命名法。
属性:描述这类事物的特征。
方法:描述这类事物的具体行为。

四、定义一个简单的类(只包含方法)

定义类

class Dog:

    def eat(self):
        print('吃骨头...')

    def sleep(self):
        print('睡觉了...')

创建对象
一个叫wangcai的狗狗
这只狗狗会吃饭
这只狗狗会睡觉

wangcai = Dog()
wangcai.eat()
wangcai.sleep()

再创建一个对象

dog1 = Dog()
dog1.eat()
dog1.sleep()
dog1.eat()

五、self变量

self : 哪个对象调用方法或者属性,self就是那个对象。
练习查看 self和 对象的内存id值是否相同。

在这里插入图片描述

六、在类的外部增加属性

方式: 对象名.属性名=值
注意:这种方式虽然简单,但是不推荐使用

class Person:

    def eat(self):
        print(self.name, '吃饭啦!')


lee = Person()
lee.name = '李嘉豪'
lee.eat()  # 李嘉豪 吃饭啦!

如果,lee.name赋值之前运行了lee.eat(),则会报错,因为eat()方法中没有找到self.name变量

七、__init__()方法

__init__()内置方法在创建对象的时候自动执行。
我们可以在 init()中做一些初始化操作。

class Cat:
    def __init__(self,):
        self.name = 'Tom'


cat = Cat()
print(cat.name)

cat2 = Cat()
print(cat2.name)

两个print函数输出的结果都是Tom

1、利用参数设置初始值

在调用__init__():方法的时候进行初始值的设置
格式:__init__(self,arg1,arg2…)
对象调用时:dog=Dog(‘aa’,’bb’…)
实参和形参一一对应。

具体例子:创建Dog类创建对象的时候传递参数。

class Dog:
    def __init__(self, new_name, new_age):
        self.new_name = new_name
        self.new_age = new_age

    def introduce(self):
        print("%s的年龄是:%d" % (self.new_name, self.new_age))


dog = Dog('wangcai', 2)
dog.introduce()  # wangcai的年龄是:2
dog1 = Dog('xixi', 1)
dog1.introduce()  # wangcai的年龄是:2

八、__str__()方法

打印对象的名称时默认调用的是__str__()方法,此方法默认返回的是对象的内存地址。
我们可以重写 str() 方法打印对象保存的信息。

class Dog:
    def __str__(self):
        return "这是一只狗"


dog1 = Dog()
print(dog1)  # 这是一只狗

九、面向对象综合应用小练习

1、计算圆的面积和周长

from math import pi


class Circle:
    def __init__(self, r):
        self.r = r

    def perimeter(self):
        return 2 * pi * self.r

    def area(self):
        return pi * self.r * self.r


c1 = Circle(4)
c1_perimeter = c1.perimeter()
print(c1_perimeter)  # 25.132741228718345
c1_area = c1.area()
print(c1_area)  # 50.26548245743669

十、类属性和实例属性

实例属性:在实例对象中定义的属性
类属性:在类对象(也就是类)中定义的属性,并且多个实例对象之间共享一份类属性。
类属性的使用方式:
类名.类属性
也可以使用 对象名.类属性
注意
(1)对于不可变数据类型来说: 对象名.静态属性名称是给对象中添加属性名称,而不是进行修改。因此类变量最好使用类操作。
(2)对于可变数据类型来说:
如果对象是修改可变数据类型变量中的数据,都有影响。
如果是从新给可变数据类型变量赋值,这是给该对象添加属性。

举例1:在类中定义一个不可变数据类型变量,然后用类对象以及实例对象调用类属性

class Course:
    language = 'chinese'

    def __init__(self,  course_name):
        self.course_name = course_name


python = Course('python')
java = Course('java')

print(Course.language)  # chinese
print(python.language)  # chinese
print(java.language)  # chinese

如上的代码所示,python和java是Course类中的一个实例,和类本身一样,他们都可以调用Course类的变量

举例2:分别使用类对象和实例对象修改类属性的值

(1)使用类对象修改类属性的值

Course.language = 'english'
print(Course.language)  # english
print(python.language)  # english
print(java.language)  # english

如上面的代码所示,原来的Course.language是chinese,而现在用类对象修改它之后,它本身发生了变化,所以影响了python和java这些实例对象
(2)使用实例对象修改类属性的值

python.language = 'japanese'
print(Course.language)  # chinese
print(python.language)  # japanese
print(java.language)  # chinese

如上的代码所示,python这个实例对象并不能修改类属性,只是给python实例对象添加了一个language属性

以上的language是不可变数据类型,下面来试一下修改可变数据类型

class Course:
    lst=[1,2]

    def __init__(self,  course_name):
        self.course_name = course_name


python = Course('python')
java = Course('java')

举例3:使用实例对象修改可变数据类型的元素值

python.lst[0] = 5
print(Course.lst)  # [5, 2]
print(python.lst)  # [5, 2]
print(java.lst)  # [5, 2]

如上代码所示,虽然只是用实例对象修改类中的可变数据类型,但是是真正地修改了

练习4:使用实例对象重新给类属性进行赋值

python.lst = ['a', 'b']

print(Course.lst)  # [1, 2]
print(python.lst)  # ['a', 'b']
print(java.lst)  # [1, 2]

如上代码所示,重新赋值,是给这个实例对象添加属性,并不会影响到类对象中的数据

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值