面向对象初识(代码片段)

shuoliuchina shuoliuchina     2023-04-14     219

关键词:

面向对象初识

面向过程与面向对象

编程语言发展历程:

机器语言 --> 汇编语言 --> 高级语言

数学向左,上帝向右。数学家的思维总是倾向于将事物抽象化,寻求程序运行效率的最大化。但是正常人的思维赶不上数学家的思维。而且在硬件运行速度足够快,内存空间足够大的今天,已经不特别在意程序的运行速度。人们更在意的是程序的开发速度。面向对象的编程思想应运而生。

面向过程

  • 事件为中心:分析出解决问题所需的步骤,然后用函数把这些步骤实现,并按顺序调用
  • 维护、复用、扩展性差

面向对象

  • 与面向对象相辅相成,在软件开发过程中,宏观上,用面向对象来把握事件间复杂的关系
  • 性能低于面向过程

举一个通俗一点的例子,我们想要开一家饭店,如果用面向过程的方法,我们就要自己租房子,买菜,接待客人,做菜,擦桌子,洗盘子等等。如果用面向对象的方法,租房子我们去找中介,买菜去找采购,做菜找厨师,接待客人招服务员等等。

需要指明的是,面向过程和面向对象不属于任何一门编程语言,它们只是两种不同的编程思想。

类和对象

类是对象的抽象,是一类事物的总称;

对象是类的具象,是一个具体的事物。

先有类,通过类可以创建对象。

数据类型是数据的封装,函数是算法的封装。

类是数据和算法的封装,更高一级。

区分类和对象:

狗    # 类
奥迪A8    # 类
电脑    # 类
我的电脑    # 对象
苹果    # 类
我现在坐的椅子    # 对象
男人    # 类
我的女朋友    # 对象

创建类

我们使用 class 关键字创建一个类,类名要求同变量命名规则类似,同时要求首字母要大写。创建类时,类名后可以不加括号,如果一定要加括号,记得在里面加上 object:

# 方法一,类名后面加(object)
class GirlFriend(object):
    sex = '女'
    
# 方法二,类名后什么都不加
class GirlFriend:
    sex = '女'

使用伪代码来表示,我们可以这样创建一个类:

class 类名(父类):
    属性
    方法

类中包含属性(特征)和方法(行为)。属性通常是变量,用来表示类是什么样的;方法通常是函数,用来体现类能干什么。

我们可以通过 .__dict__ 方法查看类中的所有内容:

class GirlFriend:
    name = '小丽'
    age = 18
    height = 172
    weight = 100
    money = 10000000000

    def chui_tui(self):
        print('给主子捶腿~')
    def give_money(self):
        print('给你100元')
        self.money -= 100

print(GirlFriend.__dict__)

输出的结果为:

'__module__': '__main__', 'name': '小丽', 'age': 18, 'height': 172, 'weight': 100, 'money': 10000000000, 'chui_tui': <function GirlFriend.chui_tui at 0x00000267C73BDB70>, 'give_money': <function GirlFriend.give_money at 0x00000267C73BDAE8>, '__dict__': <attribute '__dict__' of 'GirlFriend' objects>, '__weakref__': <attribute '__weakref__' of 'GirlFriend' objects>, '__doc__': None

在上面的例子中,nameageheightweightmoney 都是类的属性。chui_tuigive_money 是类的方法。

创建对象

对象的创建和调用方法用伪代码表示是这样的:

对象名 = 类名()    # 创建一个类对象

对象名.属性名    # 调用类属性
对象名.方法名()   # 调用类方法

对象名.属性名 = 属性值    # 为当前对象添加新属性

为当前对象添加新方法的方式比较繁琐,也不常用,仅作了解即可:

import types    # 先导入types方法

class Person:    # 创建类
    def __init__(self, name):
        self.name = name

def eat(self):    # 需要添加的函数,注意要使用self作为第一个参数
    print('吃东西')

xiaoming = Person('小明')    # 创建一个对象
xiaoming.eat = types.MethodType(eat, xiaoming)    # MethodType方法有两个参数,第一个参数是要像对象中添加的方法,第二个参数是接受方法的对象
xiaoming.eat()    # 此时,对象中已经存在eat方法

类属性和实例属性

类属性

  • 属于类
  • 当前类的所有对象该属性的值都一样
  • 类对象推荐直接用类名访问,虽然也可以使用对象名访问(不推荐)
  • 改变类变量的值,会作用于该类所有的实例化对象
  • 可以通过类名在类外添加新的类属性

具体示例为:

class GirlFriend:
    name = '小丽'
    age = 18
    height = 172
    weight = 100
    money = 10000000000

    def chui_tui(self):
        print('给主子捶腿~')
    def give_money(self):
        print('给你100元')
        self.money -= 100
        
xiaoli = GirlFriend()
xiaohong = GirlFriend()
print(xiaoli.name, xiaohong.name, GirlFriend.name)
GirlFriend.age = 16
print(xiaoli.age, xiaohong.age, GirlFriend.age)
GirlFriend.color = 'white'
print(xiaoli.color, xiaohong.color, GirlFriend.color)

输出的结果为:

小丽 小丽 小丽
16 16 16
white white white

实例属性(类属性)

  • 实例属性(实例变量)需要使用初始化方法来定义,用伪代码表示为:

    class 类名:
        def __init__(self, name):    # self只能在类内使用,在类外使用则无效
            self.name = name    # 形参可以和示例变量名相同,也常这样写
  • 属于对象

  • 当前类的对象可以拥有各自的属性值

  • 实例变量只能通过对象名访问,无法通过类名直接访问

  • 实例属性不仅可以在 __init__ 方法里添加,还可以在类的其他方法中添加

  • 查询对象中所有属性的方法为:对象.__dict__

具体操作实例为:

class GirlFriend:
    eye_num = 2
    sex = '女'
    
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def chui_tui(self, num):
        print(f'self.name给大哥捶num次腿')
        self.love = True
    
xiaoli = GirlFriend('小丽', 16)
xiaohong = GirlFriend('小红', 17)
xiaoli.chui_tui(10)
print(xiaoli.love)

输出的结果为:
小丽给大哥捶10次腿
True

类对象和实例对象有几点需要注意:

  • Python 允许通过对象访问类变量,但无法通过对象修改变量的值
  • 通过对象修改变量的值,不是在给 变量赋值,而是定义新的实例变量
  • 实例变量可以和类变量同名,但是在这种情况下,使用类对象将无法调用示实例变量1
  • 修改一个对象的实例变量,既不会影响类变量的值,也不会影响其他对象的实例变量

上述说明用实例验证如下:

class GirlFriend:
    name = '小丽丽'
    eye_num = 2
    sex = '女'
    
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def chui_tui(self, num):
        print(f'self.name给大哥捶num次腿')
        self.love = True
    
xiaoli = GirlFriend('小丽', 16)
xiaohong = GirlFriend('小红', 17)
print(xiaoli.sex)    # 女
print(GirlFriend.__dict__['sex'])    # 女
print(xiaoli.__dict__)    # 'name': '小丽', 'age': 16
xiaoli.sex = '保密'
print(GirlFriend.__dict__['sex'])    # 女
print(xiaoli.__dict__)    # 'name': '小丽', 'age': 16, 'sex': '保密'
print(xiaohong.name)    # 小红
xiaoli.name = '小莉'
print(GirlFriend.__dict__['name'])    # 小丽丽
print(xiaoli.__dict__['name'])    # 小莉
print(xiaohong.__dict__['name'])    # 小红

输出的结果为:

女
女
'name': '小丽', 'age': 16
女
'name': '小丽', 'age': 16, 'sex': '保密'
小红
小丽丽
小莉
小红

系统类

Python 无处不对象。比如,我们创建列表就是在进行类的实例化和调用:

list1 = list()    # Python中内置了一个list类,这里直接进行实例化
list1.append(1)    # 调用list类中的append方法

  1. 这一点可以理解为变量的查找是有顺寻的,优先查找实例变量。当实例变量不存在时,去查找类变量。?

面向对象初识(代码片段)

面向对象 面向过程核心:过程(即流水线思维) 优点:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可 缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身 应用场景:一旦完... 查看详情

初识面向对象(代码片段)

面向过程与面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。优点是:极大的降低了写程序的复杂度,... 查看详情

面向对象初识(代码片段)

面向对象classPerson():#声明一个类contry=‘CN‘#静态属性,类属性def__init__(self,*args):#初始化方法,调用类时触发方法,调用之前,python帮我们创建了一个空对象selfself.name=args[0]#给self的属性赋值self.age=args[1]defwalk(self,n):#方法,必须... 查看详情

初识面向对象(代码片段)

一、面向过程VS面向对象1、面向过程  核心是过程(流水线思维),过程即解决问题的步骤,即先干什么再干什么......面向过程的设计就好比精心设计好一条流水线,是一种机械式的思维方式。优点是:极大的降低了写程序的... 查看详情

面向对象初识(代码片段)

一,初始面向对象.面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。优点是:极大的降低了写程序的复杂度,只需要... 查看详情

初识面向对象(代码片段)

面向过程与面向对象面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。面向过程=个人视角我要去做大保健,我只需考虑,我有没有钱,去哪家店,怎么... 查看详情

python中面向对象初识到进阶(代码片段)

面向对象初识到进阶#面向对象结构:#class类名:#def__init__(self,参数1,参数2):#self.对象的属性1=参数1#self.对象的属性2=参数2##def方法名(self):pass##def方法名2(self):pass##对象名=类名(1,2)#对象就是实例,代表一个具体的东西##类名():类名+... 查看详情

初识面向对象(代码片段)

初识类静态类类的作用对象之间交互一如何创建一个类:(具有相同属性和方法的同一类事物)classData:#注意类名首字母要大些(规定)关键字classdef__init__(self,a)#这是一个内置方法,self是一块内存空间后面可以跟参数按顺序)  delf.a=ado... 查看详情

18.07.23(初识面向对象)(代码片段)

类:具有相同属性和技能的食物    语法:class 类名: 类名的首字母大写 例:classPerson:对象(实例):具体的某一事物;具体类的表现;具体的实实在在的一个实例实例化:类---->对象的过程例:classPreson:soup="有灵魂... 查看详情

面向对象初识(代码片段)

一.面向对象初识   1.1回顾面向过程编程vs函数式编程      #面向过程编程测量对象的元素个个数。s1=‘fjdsklafsjda‘count=0foriins1:count+=1l1=[1,2,3,4]count=0foriinl1:count+=1面向过程编程deffunc(s):count=0foriins:cou... 查看详情

面向对象的初识(代码片段)

转自https://www.cnblogs.com/schut/p/8541547.html一、面向过程  1、面向过程:核心是过程二字,过程指的是解决问题的步骤,好比如设计一条流水线,是一种机械式的思维方式。     就是程序从上到下一步步执行,一步步从上到... 查看详情

初识面向对象(代码片段)

你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战,那至少需要2个角色,一个是人,一个是狗,且人和狗都有不同的技能,比如人拿棍打狗,狗可以咬人,怎么描述这种... 查看详情

面向对象初识(代码片段)

目录面向对象初识面向过程与面向对象类和对象创建类创建对象类属性和实例属性系统类面向对象初识面向过程与面向对象编程语言发展历程:机器语言-->汇编语言-->高级语言数学向左,上帝向右。数学家的思维总是倾向于... 查看详情

c++初识类和对象(代码片段)

类和对象(上)一.初步认识面向过程和面向对象二.类的引入三.类的定义四.类的访问限定符及封装1.访问限定符2.封装五.类的作用域六.类的实例化七.类对象模型1.计算类对象的大小2.类对象的存储方式八.this指针1.this指针... 查看详情

面向对象初识(代码片段)

一、面向对象(OOP)基本概念    面向对象编程 —— ObjectOrientedProgramming 简写 OOP1.1过程和函数过程 是早期的一个编程概念过程 类似于函数,只能执行,但是没有返回值函数 不仅能执行,还可以返回... 查看详情

第六章(代码片段)

 阅读目录面向过程vs面向对象初识面向对象  类的相关知识  对象的相关知识  对象之间的交互  类命名空间与对象、实例的命名空间  类的组合用法  初识面向对象小结面向对象的三大特性  继承  多态... 查看详情

js高级进阶javascript初识面向对象(代码片段)

...题挑战赛第2期参赛话题:面试宝典目录前言一,面向对象介绍二,创建生成实例三,继承四,super关键字写在最后前言本篇主要讲解了什么是面向对象,如何创建使用类,super关键字的使用以及注意事... 查看详情

面向对象程序设计关于lua的初识之类(代码片段)

一些面向对象的语言中提供了类的概念,作为创建对象的模板。在这些语言里,对象是类的实例。Lua不存在类的概念,每个对象定义他自己的行为并拥有自己的形状(shape)。然而,依据基于原型(proto... 查看详情