返回顶部
首页 > 资讯 > 后端开发 > Python >python学习笔记:第16天 面向对象
  • 694
分享到

python学习笔记:第16天 面向对象

面向对象学习笔记python 2023-01-30 22:01:24 694人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录 ⼀、类的成员介绍: 二、类的成员-变量 三、类的成员-方法 四、类的成员-属性 五、私有属性

目录

  • ⼀、类的成员介绍:
  • 二、类的成员-变量
  • 三、类的成员-方法
  • 四、类的成员-属性
  • 五、私有属性

⼀、类的成员介绍:

⾸先, 什么是类的成员. 很简单. 我么能在类中写什么? 写的内容就是成员. 到⽬前为⽌. 我们
已经学过了⼀些成员了.

class Foo:
    def __init__(self, a, b):
        self.a = a              # 这里的self.a和self.b都是成员
        self.b = b

    def method(self):           # 方法也是类的成员
        pass
  • 在上⾯代码中__init__和method都属于类的成员⽅法,⼜称为实例⽅法。总之这样的东⻄
    需要⽤对象来访问。
  • 上⽅的self.a = a这个代码的含义是给对象设置属性信息,含义是这个对象的xxx属性是xxxx. 这种东⻄⼜被称之为成员变量或者实例变量, 再或者被称之为字段。

二、类的成员-变量

在类中变量分成两⼤类:

  1. 实例变量(字段)
  2. 类变量(静态变量)

1. 实例变量

其实之前写的都是实例变量,所谓实例变量就是实例(也就是对象)的变量,实例也是就是指self,也是就是说,前面写的self.xxx都是实例变量:

class Foo:
    def __init__(self, name, age):
        self.name = name
        self.age = age

f1 = Foo('Jerry', 18)
f2 = Foo('James', 29)
print(f1.name, f1.age)              # 每个对象都拥有自己的实例变量
print(f2.name, f2.age)              # 实例变量都必须要通过实例来调用

# 结果:
# Jerry 18
# James 29

2. 类变量

类变量是一个类所拥有的,每个实例也可以直接访问类变量。类变量就可以看作是一个类公有的一种变量,如果对象自己没有设置这个值,那么默认就用统一的类变量。

class Person:
    country = '中国'                # 类变量
    
    def __init__(self, name, age):  # 实例变量中并没有设置country属性
        self.name = name
        self.age = age

Person.country = '大清'
print(Person.country)               # 打印结果是:大清

p1 = Person('zzc', 26)
print(p1.country)                   # 打印结果也是大清

从上面的例子可以看出如果对象中没有country属性,那么会使用类变量country,下面再看一个例子:

class Person:
    country = '中国'
    
    def __init__(self, name, age):
        self.name = name
        self.age = age

Person.country = '大清'              # 类变量修改后变成了‘大清’ 

p1 = Person('zzc', 26)
print(p1.country)                   # 打印结果是:大清

p2 = Person('milkGood', 27)
print(p2.country)                   # 打印结果也是大清

上面的例子说明,变量p1p2使用的都是同一个变量country,在手动把类变量的值修改过后,变量p1p2所对应的country也跟着改变了,所以他们是指向的同一块物理地址。下面我们把上面的程序改一下,来看⼀个和类变量息息相关的坑:

class Person:
    country = '中国'
    
    def __init__(self, name, age):
        self.name = name
        self.age = age

# Person.country = '大清'           # 这里先把修改类变量的语句注释了
print(Person.country)               # 首次打印的是类变量最开始时候的值

p1 = Person('zzc', 26)              # 然后实例化了一个对象p1
p1.country = '大清'                 # 然后修改了对象中的country的值为大清
print(p1.country)                   # 此时打印结果是:大清

p2 = Person('milkgood', 27)         # 再次实例化了一个对象p2
print(p2.country)                   # 打印结果还是中国

# 输出结果:
# 中国
# 大清
# 中国

我们来看下面的图来分析:

好了. 来对类成员中的变量做个简单的总结:

  • 实例变量:给对象⽤的.
  • 类变量:多个对象共享的. 最好是⽤类名来访问. 这样更加规范

三、类的成员-方法

类中的方法分为三种:

  1. 成员⽅法(实例⽅法)
  2. 静态⽅法
  3. 类⽅法

1. 成员方法

成员方法也是之前写的最多的方法,可以说之前写的方法都是成员方法,也就是说对象直接访问的方法就是成员方法

class Car:
    def run(self):
        print('老司机永不翻车')
        
    def jump(self):                # 这中带self参数的都是实例方法,之前写的都是实方法
        print('you jump i jump')
        
c = Car()
c.run()
c.jump()

# 输出结果:
# 老司机永不翻车
# you jump i jump

实例方法也能像实例变量一样赋值

def fly():
    print('我是一辆会飞的车')

class Car:
    def run(self):
        print('老司机永不翻车')
        
    def jump(self):                # 这中带self参数的都是实例方法,之前写的都是实方法
        print('you jump i jump')
        
c = Car()
c.fly = fly         # 像实例变量一样把函数名赋值给实例的一个属性
c.fly()             # 打印结果: 我是一辆会飞的车

2. 类方法

跟类变量一样,是属于类的命名空间的,可以直接通过类名来访问(需要传入一个参数cls),但是要注意,类方法需要在函数上加上一个名为claSSMethod的装饰器

class Person:
    def eat(self):
        print('i\'m eating')
    
    @classmethod                    # 加上classmethod装饰器
    def drink(cls):                 # 这个cls参数在使用类调用时,python解释器会自动传入
        print(cls)
        print('i\'m drinking')
        
print(Person)
Person.drink()                      # 使用类名直接访问

p = Person()
p.drink()                           # 也可以实例化对象后,通过对象访问,但是不建议这么做

# 打印结果:
# <class '__main__.Person'>
# <class '__main__.Person'>
# i'm drinking
# <class '__main__.Person'>
# i'm drinking

3. 静态方法

静态方法也跟类方法一样,跟对象无关,直接使用类直接访问且无需参数,但是要加上staticmethod装饰器

class Foo:
    def __init__(self, user):
        self.user = user

    @staticmethod                       # 加上staticmethod装饰器
    def staticMthod():                  # 这里不用传入参数
        print('这是一个静态方法')

Foo.staticMthod()                       # 直接使用类访问
f = Foo('s')
f.staticMthod()                         # 也可以通过对象访问,不过不建议

# 输出结果
# 这是一个静态方法
# 这是一个静态方法

既然静态方法和类方法都是跟对象无关的,都可以通过类来访问,那么他们有什么区别呢:

  • 类方法在传参的时候,需要传入一个类,而静态方法在使用时不需要传入任何参数,可以直接通过类调用
  • 类方法在传参的时候接收了一个参数,cls可以通过cls访问类中的变量,而静态方法则不行,静态方法需要使用类名来访问(即使在类的内部也是如此)

四、类的成员-属性

属性其实就是通过⽅法改造过来的⼀种变量的写法, 在⽅法上添加⼀个@property就可以了

class Person:
    def __init__(self):
        pass
    @property
    def age(self):
        return 1

p = Person()
age = p.age
print(age)

应⽤场景: 我们⼀般保存数据的时候, 不会保存⼀个⼈的年龄. 因为随着时间的推移. 每个⼈的年龄都时刻在改变着. 那如何保存更加完美呢? 很简单. 保存出⽣年⽉⽇. 然后⽤程序来计算,你当前的年龄. 实时的. 那这个时候就需要进⾏相应的计算了. ⽽计算属于⼀个功能. 当然要写⽅法⾥了. 但是对于年龄这个属性⽽⾔. 他应该是⼀个数值. ⽽不是动作. 所以Python就提供了这样⼀种机制. 通过⽅法来描述⼀个属性.

注意:

  • ⽅法参数只能有⼀个self
  • ⽅法上⽅要写@property
  • 调⽤的时候, 我们不需要写括号. 直接当成属性变量来⽤就可以了.
  • 这种套路只能取值. 不能设置值

五、私有属性

在python的类中使用__xx(以双下划线开头,不能以双下划线结尾)来定义一个私有属性,定义的私有属性一般(除去使用特殊的方法)是从外面获取不到的。

class Foo:
    __c = 30                # 私有类变量
    def __init__(self):
        self.a = 10
        self.__b = 20       # 私有的实例变量

    def __func(self):       # 私有方法也跟私有变量一样
        print('私有方法')

f = Foo()
print(f.a)                  # 下面的都会报错
print(f.__b)                # AttributeError: 'Foo' object has no attribute '__b'
print(Foo.__c)              # AttributeError: type object 'Foo' has no attribute '__c'
f.__func()                  # AttributeError: 'Foo' object has no attribute '__func'

--结束END--

本文标题: python学习笔记:第16天 面向对象

本文链接: https://lsjlt.com/news/180144.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python学习笔记:第16天 面向对象
    目录 ⼀、类的成员介绍: 二、类的成员-变量 三、类的成员-方法 四、类的成员-属性 五、私有属性 ...
    99+
    2023-01-30
    面向对象 学习笔记 python
  • python学习笔记:第17天 面向对象
    一、类与类之间的依赖关系 ⼤千世界, 万物之间皆有规则和规律. 我们的类和对象是对⼤千世界中的所有事物进⾏归类. 那事物之间存在着相对应的关系. 类与类之间也同样如此. 在⾯向对象的世界中. 类与类 中存在以下关系: 依赖关系 关联关系...
    99+
    2023-01-30
    面向对象 学习笔记 python
  • js 面向对象学习笔记
    目录数据赋值拷贝值类型赋值--函数形参&实参引用类型赋值对象的动态性delete删除属性数据赋值拷贝 1、值得赋值是独立的 num1=12; num1=num2 将存储值赋值...
    99+
    2023-05-18
    js 面向对象
  • Python 3 学习笔记:面向对象编程
    概述 面向对象编程(Object Oriented Programming,即 OOP),是一种程序设计思想,比面向过程编程更加灵活,更易扩展。 Python 在设计的时候就是按照面向对象编程的思想设计的,像我们前面学过的各种数据类型,如字...
    99+
    2023-01-31
    面向对象 学习笔记 Python
  • 学习python的第十八天(面向对象编程
    一.面向对象编程 ​ 面向过程编程,核心是编程二字,过程指的是解决问题的步骤,即先干什么、后干什么、再干什么、然后干什么…… 与工厂的工艺流程差不多,前后都有影响 优点:复杂的问题流程化,进而简单化,调理清晰. 缺点:拓展性不行 二.对...
    99+
    2023-01-31
    面向对象 python
  • Python学习笔记:第一天python
    目录 1. python简介 2. python的安装 3. 编写第一个helloword 4. 变量和常量 5. 数据...
    99+
    2023-01-30
    学习笔记 Python python
  • Python的面向对象编程方式学习笔记
    类与实例 类与实例相互关联着:类是对象的定义,而实例是“真正的实物”,它存放了类中所定义的对象的具体信息。 下面的示例展示了如何创建一个类: class MyNewObjectType(bases): ...
    99+
    2022-06-04
    面向对象 学习笔记 方式
  • Python学习笔记:第2天while循
    目录 1. while循环 continue、break和else语句 2. 格式化输出 3. 运算符 ...
    99+
    2023-01-30
    学习笔记 Python
  • PHP学习笔记:面向对象编程基础
    导言:面向对象编程(Object-Oriented Programming,简称OOP)是一种编程的思维方式,通过将问题分解为多个对象并定义对象之间的交互,来解决复杂的编程问题。PHP作为一门功能强大的编程语言,也支持面向对象编程。本文将介...
    99+
    2023-10-21
    PHP 基础 面向对象编程(OOP)
  • Python - 面向对象学习
    本节内容: 面向对象编程介绍为什么要用面向对象进行开发?面向对象的特性:封装、继承、多态类、方法、  引子你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战,那至少需要2个角色,一个是...
    99+
    2023-01-31
    面向对象 Python
  • Java学习笔记之面向对象编程精解
    目录包继承super 关键字finalprotected关键字组合多态抽象类接口面向对象编程(包、继承、组合、多态 、抽象类、接口) 包 包其实就是类的集合,其本质上其实就是一个文件...
    99+
    2024-04-02
  • python3第八天(面向对象)
    面向对象技术简介:    类(Class):用来描述具有相同属性的方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例.    类变量:类变量在整个实例化的对象中是公用的.类变量定义在类中,具在函数体之外.类变量通常...
    99+
    2023-01-31
    面向对象 第八天
  • python学习笔记:第19天 类的约束
    目录 一、类的约束 二、异常处理: 三、MD5加密 四、日志(logging模块) 一、类的约束 真正写写...
    99+
    2023-01-30
    学习笔记 python
  • python学习笔记:第7天 深浅拷贝
    目录 1. 基础数据类型补充 2. set集合 3. 深浅拷贝 1. 基础数据类型补充 (1)join方法 join方法是...
    99+
    2023-01-30
    深浅 学习笔记 python
  • python_面向对象笔记
    继承 什么是继承? 继承是一种新建类的方式,新建的类称为子类或派生类父类又称为基类、超类子类可以“遗传”父类的属性,从而可以减少代码冗余如何寻找继承关系?先抽象,再继承,继承描述的就是一种父子关系 / 从属关系继承的语法class Fo...
    99+
    2023-01-30
    面向对象 笔记
  • Python学习 :面向对象 -- 三大
    面向对象的三大特性 一、封装 把数据、值、变量放入到对象中 构造方法 _init_方法 特殊作用: 在 obj = 类名() 执行时: 内部自动执行两个步骤: 1、创建对象 2、通过对象执行类中的一个特殊方法(_init_方法) ...
    99+
    2023-01-30
    三大 面向对象 Python
  • python学习32(面向对象_3)
    继承 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。即一个派生类(derived class)继承基类(bass class)字段和方法。继承也允许把一个派生...
    99+
    2023-01-31
    面向对象 python
  • python学习笔记:第6天 小数据池和
    目录 1. id 和 == 2. 小数据池 3. 编码和解码 1. id 和 == id:id是一个内置的函数,可以查...
    99+
    2023-01-30
    学习笔记 数据 python
  • Python面向对象编程中关于类和方法的学习笔记
    类和实例 python是一个面向对象的语言,而面向对象最重要的概念就是类和实例, 记得刚学习的时候不太理解这些概念,直到老师说了一句”物以类聚”. 没错就是类, 归类 物以类聚 类其实就是把一些相同特性的事...
    99+
    2022-06-04
    面向对象 学习笔记 方法
  • Redis学习笔记(六) 对象
    前面我们看了Redis用到的主要数据结构,如简单动态字符串(SDS)、双向链表、字典、压缩列表、整数集合等。 但是Redis并没有直接使用这些数据结构来实现键值对,而是基于这些数据结构创建了一个对象系统,这个系统包括字符串对象、列...
    99+
    2021-06-25
    Redis学习笔记(六) 对象
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作