Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python学习笔记:第16天 面向对象

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

作者头像
py3study
发布于 2020-01-19 01:39:46
发布于 2020-01-19 01:39:46
36500
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

目录

⼀、类的成员介绍:

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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都是实例变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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. 类变量

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,下面再看一个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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也跟着改变了,所以他们是指向的同一块物理地址。下面我们把上面的程序改一下,来看⼀个和类变量息息相关的坑:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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. 成员方法

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的装饰器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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装饰器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Foo:
    def __init__(self, user):
        self.user = user

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

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

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

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

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

四、类的成员-属性

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Person:
    def __init__(self):
        pass
    @property
    def age(self):
        return 1

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

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

注意:

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

五、私有属性

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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'
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/03/31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
day 17 成员
    def __init__(self, name, id, gender, birth):
py3study
2020/01/22
5210
Python全栈开发之面向对象
类是对一群具有相同特征或者行为的事物统称,是抽象的,不能直接使用,特征被称为属性,行为被称为方法,类就是一个模板
py3study
2020/01/10
5000
python 成员
一.成员 1.实例变量 对象.属性=xxxx 1 class Person: 2 def __init__(self,name,id,gender,birth): 3 self.name = name 4 self.id = id 5 self.gender = gender 6 self.birth = birth 7 8 p = Person('哈哈','10086','不详','1990-12-15') 9 print(p.bi
py3study
2020/01/19
6700
Python面向对象(成员)(二)
        特点: 在声明的时候. 需要给出self, self必须放在第一个位置
py3study
2020/01/22
6080
python之成员(面向对象)
2. 变量   1. 实例变量: 昨天写的就是实力变量, 由对象去访问的变量.   2. 类变量. 此时. 这个变量属于类. 但是对象也可以访问.
py3study
2020/01/20
6070
Python 【面向对象】
Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。本章节我们将详细介绍Python的面向对象编程。
IT茂茂
2020/03/19
1.7K0
史上最全 Python 面向对象编程
在多函数程序中,许多重要的数据被放置在全局数据区,这样它们可以被所有的函数访问。每个函数都可以具有它们自己的局部数据,将某些功能代码封装到函数中,日后便无需重复编写,仅调用函数即可。从代码的组织形式来看就是根据业务逻辑从上到下垒代码 。
马哥linux运维
2019/04/01
6280
史上最全 Python 面向对象编程
八、python学习笔记-面向对象-类对象
# 通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法 """类对象 需要知道的是self代指实例,cls代指类,这是python中定义好的规范 变量(字段): 1、实例变量(普通字段):实例变量属于实例(对象),只在实例(对象)方法被调用 2、类变量(静态字段):类变量属于类,在内存中只保存一份,当一个类中的多个方法使用相同的变量(字段)使类变量,类变量可以被类和实例(对象)调用 方法: 1、普通方法:保存在类中,通常由实例(对象)调用,但是可以通过类和实例
堕落飞鸟
2022/01/14
7530
python高级-面向对象特性(12)
在现实生活中,继承一般指的是子女继承父辈的财产,在程序中,继承描述的是事物之间的所属关系,例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物;同理,波斯猫和巴厘猫都继承自猫,而沙皮狗和斑点狗都继承足够,如下如所示:
Se7eN_HOU
2019/09/11
5030
python高级-面向对象特性(12)
Python的面向对象
面向对象 目的: 写出有意义的面向对象的代码,其作用就是封装代码 定义时注意: 命名规范 Student、StudentPages 类体不能什么都不写,要写pass 定义示例: class Student(): # 开始类体的编写 name = '' age = 0 def print_file(): print('age = '+str(age)) stu = Stud
ZONGLYN
2019/08/08
4920
面向对象之类的成员,嵌套
类的成员可分为三大类:字段丶方法和属性 一丶字段   字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同.   普通字段属于对象   静态字段属于类 class Foo: #类变量(静态字段) country = "你好" def __init__(self,name): # 实例变量(普通字段) self.name = name def too(self): print("====
py3study
2020/01/19
1.8K0
面向对象之类的成员,嵌套
7.0 Python 面向对象编程
python是一种面向对象的编程语言,面向对象编程(Object-Oriented Programming,OOP)是一种编程思想,其核心概念是“对象”。对象是指一个具有特定属性和行为的实体,而面向对象编程就是通过对这些实体进行抽象、分类、封装和继承等操作,来实现程序的结构和逻辑。在python中,我们可以通过定义类、创建实例和调用方法等方式,来实现面向对象编程的思想,从而编写出更加灵活、可扩展、易维护的程序。
王 瑞
2023/08/14
3090
30天拿下Python之面向对象编程
在上一节,我们介绍了Python的函数,包括:函数的定义、函数的调用、参数的传递、lambda函数等内容。在本节中,我们将介绍Python的面向对象编程。面向对象编程(Object-Oriented Programming, 即OOP)是一种编程范型,它以对象为基础,将数据和操作封装在一个类(Class)中。在Python中,类是一种定义对象结构和行为的模板,而对象则是类的实例。类定义了一个新的类型,用于创建具有特定属性和方法的对象。类是面向对象编程的核心,它允许程序员使用对象来组织代码和复用代码。
用户6256742
2024/06/22
950
Python学习(八)---- 面向对象类之进阶
原文地址: https://blog.csdn.net/fgf00/article/details/52479307 编辑:智能算法,欢迎关注! 上期我们一起学习了python中的类
智能算法
2018/10/08
4570
Python学习(八)---- 面向对象类之进阶
Python 面向对象编程详解
Python 支持面向过程、面向对象、函数式编程等多种编程范式,且不强制我们使用任何一种编程范式,我们可以使用过程式编程编写任何程序,在编写小程序时,基本上不会有问题.但对于中等和大型项目来说,面向对象将给我们带来很多优势.接下来将结合面向对象的基本概念和Python语法的特性讲解面向对象的编程.
王 瑞
2022/12/28
6350
图解python | 面向对象编程
教程地址:http://www.showmeai.tech/tutorials/56
ShowMeAI
2022/02/23
6540
图解python | 面向对象编程
python面向对象编程指南 pdf_python面向对象的三个基本特征
  抽象是隐藏多余细节的艺术。在面向对象的概念中,抽象的直接表现形式通常为类。虽然Python是解释性语言,但是它是面向对象的,从设计之初就已经是一门面向对象的语言。Python基本上提供了面向对象编程语言的所有元素,如果你已经至少掌握了一门面向对象语言,那么利用Python进行面向对象程序设计将会相当容易。下面就来了解一下如何在Python中进行对象编程。
全栈程序员站长
2022/11/16
8010
面向对象编程知识点
特性 class object 封装 继承 多态 语法 调用函数 --》 执行 --》返回结果 r1 = Role.__init__() return x342423 r
院长技术
2021/02/19
3420
10 . Python之面向对象
类中的方法一般都是通过对象执行的(除去类方法,静态方法外),并且对象执行这些方法都会自动将对象空间传给方法中的第一个参数self
iginkgo18
2020/09/27
4280
10 . Python之面向对象
Python升级之路( Lv6 ) 面向对象基础
第一章 Python 入门 第二章 Python基本概念 第三章 序列 第四章 控制语句 第五章 函数 第六章 面向对象基础
时间静止不是简史
2022/06/12
5810
Python升级之路( Lv6 ) 面向对象基础
相关推荐
day 17 成员
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验