首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python day7 面向对象编程 (1)

Python day7 面向对象编程 (1)

原创
作者头像
昆兰
发布于 2024-07-31 08:59:57
发布于 2024-07-31 08:59:57
11200
代码可运行
举报
运行总次数:0
代码可运行

面向对象编程 OOP

Object Oriented Programming,一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数

面向过程和面向对象

  • 面向过程,把函数继续切分为子函数
  • 面向对象,把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递

对象

自定义的对象数据类型就是面向对象中的类(Class)的概念

首先必须创建出这个学生对应的对象,然后,给对象发一个print_score消息,让对象自己把自己的数据打印出来

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score

    def print_score(self):
        print('%s: %s' % (self.name, self.score))

类(Class)和实例(Instance)

面向对象最重要的概念就是类(Class)和实例(Instance)

Class是一种抽象概念,比如我们定义的Class——Student,是指学生这个概念,而实例(Instance)则是一个个具体的Student

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
#class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object)
class Student(object):  
    pass

#创建建实例是通过类名+()实现的:
bart = Student()
# bart绑定一个name属性
bart.name = 'Bart Simpson'


#在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去
class Student(object):
    def __init__(self, name, score): #self,表示创建的实例本身
        self.name = name
        self.score = score

访问限制

由于外部代码还是可以自由地修改一个实例的属性,我们可以把属性的名称前加上两个下划线__,变成了一个私有变量(private),只有内部可以访问,外部不能访问

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
class Student(object):
    def __init__(self, name, score): #self,表示创建的实例本身
        self.__name = name
        self.__score = score
        
        #利用方法使得外部代码可以访问
        def get_name(self): 
        return self.__name
        #利用外部代码修改score
        def set_score(self, score):
        self.__score = score

继承和多态

我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
class Animal(object):   #编写Animal类
    def run(self):
        print("Animal is running...")

class Dog(Animal):  #Dog类继承Amimal类,没有run方法
    pass

class Cat(Animal):  #Cat类继承Animal类,有自己的run方法
    def run(self):
        print('Cat is running...')
    pass

class Car(object):  #Car类不继承,有自己的run方法
    def run(self):
        print('Car is running...')

class Stone(object):  #Stone类不继承,也没有run方法
    pass

def run_twice(animal):
    animal.run()
    animal.run()

run_twice(Animal())
run_twice(Dog())
run_twice(Cat())
run_twice(Car())
run_twice(Stone())

输出结果

Animal is running... Animal is running...

Animal is running... Animal is running...

Cat is running... Cat is running...

Car is running... Car is running...

AttributeError: 'Stone' object has no attribute 'run'

由于Animal类型有run()方法,因此,传入的任意类型,只要是Animal类或者子类,就会自动调用实际类型的run()方法,这就是多态的意思

这就是动态语言的“鸭子类型”,它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。

获取对象信息

type()函数

它返回对应的Class类型。如果我们要在if语句中判断,就需要比较两个变量的type类型是否相同

  • 基本数据类型就是int,str
  • 对象是函数的话,用types模块中定义的常量:types.FunctionType,types.BuiltinFunctionType,types.LambdaType,types.GeneratorType

isinstance()函数(优先)

对于class的继承关系来说,使用type()就很不方便。我们要判断class的类型,可以使用isinstance()函数

  • isinstance()判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上
  • 还可以判断一个变量是否是某些类型中的一种,比如下面的代码就可以判断是否是list或者tuple
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
>>> isinstance([1, 2, 3], (list, tuple))
True
>>> isinstance((1, 2, 3), (list, tuple))
True

dir()函数

它返回一个包含字符串的list

仅把属性和方法列出来是不够的,配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
>>> class MyObject(object):
...     def __init__(self):
...         self.x = 9
...     def power(self):
...         return self.x * self.x
...
>>> obj = MyObject()
>>> hasattr(obj, 'x') # 有属性'x'吗?
True
>>> obj.x
9
>>> hasattr(obj, 'y') # 有属性'y'吗?
False
>>> setattr(obj, 'y', 19) # 设置一个属性'y'
>>> hasattr(obj, 'y') # 有属性'y'吗?
True
>>> getattr(obj, 'y') # 获取属性'y'
19
>>> obj.y # 获取属性'y'
19

>>> getattr(obj, 'z', 404) # 获取属性'z',如果不存在,返回默认值404
404

>>> hasattr(obj, 'power') # 有属性'power'吗?
True
>>> getattr(obj, 'power') # 获取属性'power'
<bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>>
>>> fn = getattr(obj, 'power') # 获取属性'power'并赋值到变量fn
>>> fn # fn指向obj.power
<bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>>
>>> fn() # 调用fn()与调用obj.power()是一样的
81

实例属性和类属性

为了统计学生人数,可以给Student类增加一个类属性,每创建一个实例,该属性自动增加

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
class Student(object):

count = 0

def __init__(self, name):

self.name = name

Student.count += 1

发现没有直接点明init这个方法,在实例化对象的时候,应该是会自动调用一次这个方法

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
Python学习笔记(六)·面向对象编程
面向对象编程——Object Oriented Programming,简称 OOP,是一种程序设计思想。OOP 把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
公爵
2022/09/28
6720
Python学习笔记(六)·面向对象编程
Python面试题之Python面向对象编程汇总
面向对象的设计思想是从自然界中来的,因为在自然界中,类(Class)和实例(Instance)的概念是很自然的。Class是一种抽象概念,比如我们定义的Class——Student,是指学生这个概念,而实例(Instance)则是一个个具体的Student,比如,Bart Simpson和Lisa Simpson是两个具体的Student。
Jetpropelledsnake21
2019/02/15
1.9K0
Day9面向对象编程2/2
继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。 比如,我们已经编写了一个名为Animal的class,有一个run()方法可以直接打印: class Animal(object): def run(self): print('Animal is running...') 当我们需要编写Dog和Cat类
林清猫耳
2018/04/26
7410
Day9面向对象编程2/2
9 Python 基础: 手把手带你梳理对象、继承与多态知识点
在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。
野原测试开发
2019/07/24
1.2K0
9 Python 基础: 手把手带你梳理对象、继承与多态知识点
Python学习笔记(六)——面向对象编程
class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的,继承的概念我们后面再讲,通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。
蛮三刀酱
2019/09/10
4440
9-面向对象1
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
用户3106371
2019/03/11
4680
9-面向对象1
Python基础——PyCharm版本——第七章、面向对象编程
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
红目香薰
2022/11/29
3960
Python基础——PyCharm版本——第七章、面向对象编程
Python学习 Day 8 继承 多态 Type isinstance dir __slots__
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Superclass)。
Ai学习的老章
2019/04/10
1.1K0
10-面向对象2
isinstance()判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上 。
用户3106371
2019/03/11
1.8K0
10 . Python之面向对象
类中的方法一般都是通过对象执行的(除去类方法,静态方法外),并且对象执行这些方法都会自动将对象空间传给方法中的第一个参数self
iginkgo18
2020/09/27
4460
10 . Python之面向对象
极简Python入门
本文旨在帮助从总体上帮助了解Python的一些基本属性,具体的使用技巧需要通过不断实践积累 一、Python的基本特性 二、Python的类 面向对象编程,是一种程序设计思想。OOP把对象作
智能算法
2018/04/03
1.3K0
极简Python入门
python简明笔记
通过 for 语句我们可以使用 for 循环。Python 里的 for 循环与 C 语言中的不同。这里的 for 循环遍历任何序列(比如列表和字符串)中的每一个元素。下面给出示例:
拾点阳光
2018/05/03
2.4K0
python简明笔记
python 面向对象基础 获取对象信息
但是type()函数返回的是什么类型呢?它返回对应的Class类型。如果我们要在if语句中判断,就需要比较两个变量的type类型是否相同:
葫芦
2019/04/17
9600
Python|获取对象的类型,方法,setattr()添加属性
01 基本类型 基本类型都可以用type()判断: >>> type(123) <class 'int'> >>> type('str') <class 'str'> 02 指向函数或类的变量 也可以用type()判断: a = Animal() >>> type(a) <class '__main__.Animal'> >>> type(abs) <class 'builtin_function_or_method'> 如果函数不是内置函数,该怎么查看变量是否是函数类型? 03 变量指向非内置函数
double
2018/04/02
4.9K0
python学习32(面向对象_3)
继承 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。即一个派生类(derived class)继承基类(bass class)字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。 例如,有这样一个设计,一个Cat类型的对象派生自Animal类,这是模拟”是一个(is-a)”关系(例如,Cat是一个Animal)。 继承基本语法: class 派生类名(基类名1 [, 基类名2....]): 'Optional cl
py3study
2020/01/06
4100
PythonOOP面向对象编程1
车(类) -------> BYD E6 (京A.88888) 实例 ---------------> BMW X5 (xxxxxx) 实例
py3study
2020/01/16
4030
Python面向对象编程
面向对象最重要的概念就是类(Class)和实例(Instance),Java比较熟了,下面贴代码注释
听着music睡
2018/10/25
4860
Python3 面向对象
类对象支持两种操作:属性引用和实例化。 属性引用语法:obj.name 对象创建后,类命名空间中所有的命名都是有效属性名
py3study
2020/01/03
5330
史上最全 Python 面向对象编程
在多函数程序中,许多重要的数据被放置在全局数据区,这样它们可以被所有的函数访问。每个函数都可以具有它们自己的局部数据,将某些功能代码封装到函数中,日后便无需重复编写,仅调用函数即可。从代码的组织形式来看就是根据业务逻辑从上到下垒代码 。
马哥linux运维
2019/04/01
6480
史上最全 Python 面向对象编程
获取对象信息
isinstance()判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上
py3study
2020/01/15
2.2K0
相关推荐
Python学习笔记(六)·面向对象编程
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档