目录

1. 类和实例

2. 实例对象

3. Python 中的对象

4. self 参数

5. __init__() 方法

6. 类的公有/私有


1. 类和实例

OOP编程:Object-Oriented Programming 面向对象编程,有三个基本特征——封装、继承、多态。

  • 封装:对外部隐藏对象的工作细节
  • 继承:子类自动共享父类数据和方法的机制
  • 多态:可以对不同类的对象调用相同的方法,产生不同的结果

为了让程序更易用,经常需要将多种数据、代码语句等封装为函数、模块等,面向对象即需要对数据和代码同时做封装。Python中的对象,即可以认为:

对象=属性+方法

其中,对象的特征称为“属性”,对象的行为称为“方法”。

Python中,使用类(class)来定义对象的属性和方法,实用类创建的对象则称为这个类的一个实例(instance),两者定义如下:

  • 类(class):实例工厂。类定义对象的属性和方法,对象的属性通常由赋值语句添加到类中,对象的方法则通常是类中定义的各个函数,所有从类创建的实例都可继承该类的属性和方法。
  • 实例(instance):也称为实例对象(instance objects),代表程序领域中具体的元素,每个实例单独记录各自的数据。

2. 实例对象

实例对象继承了类定义的属性和方法,即实例可以调用类定义的变量和函数;

实例对象单独记录自己的数据,修改实例对象某个变量后,其他实例对象不因此而改变;

实例对象可以在类的基础上增加新的赋值语句,并可以通过 dir() 查询;

#类-tank
class tank:Name = 'ZTZ-99A'Members = ['张三','李四','王五']def __init__(self,Armor=80,HP=100,Gun=125,Armor2=0,Gun2=0):self.Armor = Armorself.HP = HPself.Gun = Gunself.TargetArmor = Armor2self.TargetGun = Gun2def attack(self):damage = self.Gun - self.TargetArmorprint(f'发起进攻,造成伤害{damage}')def defend(self):damage = self.TargetGun - self.Armorprint(f'进行防御,受到伤害{damage}')if (self.HP - damage) <= 0:print('已阵亡')else:print(f'剩余血量{self.HP-damage}')#声明实例 tankNo1
tankNo1 = tank()#可以调用类定义的变量和函数,并对其中变量数值做修改
tankNo1.Name
'ZTZ-99A'
tankNo1.attack()
发起进攻,造成伤害125
tankNo1.TargetGun = 105
tankNo1.defend()
进行防御,受到伤害25
剩余血量75##声明实例 tankNo2
tankNo2 = tank(Armor2=90,Gun2=120)
tankNo2.attack()
发起进攻,造成伤害35#修改 tankNo2 实例数据,不影响 tankNo1 实例中数据
tankNo2.Name = 'ZTZ-96A'
tankNo2.Name
'ZTZ-96A'
tankNo1.Name
'ZTZ-99A'#实例对象可以在类的基础上增加新的赋值语句,并可以通过 dir() 查询
tankNo2.Ammunition = 50
tankNo2.Ammunition
50
dir(tankNo2)
['Ammunition', 'Armor', 'Gun', 'HP', 'Members', 'Name', 'TargetArmor', 'TargetGun', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'attack', 'defend']

3. Python 中的对象

在Python中,整型变量是整数类的实例对象,字符串变量是字符串类的实例对象,列表、元组、字典、集合也类似。

x = 100
type(x)
<class 'int'>
dir(x)
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
x.real
-1
x.imag
0

4. self 参数

通常,类中所有方法(静态方法除外)的第一个参数,即 self 参数;

同一个类可以生成无数个实例对象且各自独立,self 即代表类所创建的实例;

self 用于将对象自身的引用作为第一个参数传给方法,帮助 Python 知道应该去操作类生成的哪个对象的方法;

self 参数也可以使用其他参数名,但通常默认使用 'self'。

class test:def printself(self):print(self)x = test()#self 和实例是同一个对象
x.printself()
<__main__.test object at 0x000001CBCA8A0CD0>
x
<__main__.test object at 0x000001CBCA8A0CD0>

5. __init__() 方法

__init__() 方法又称为构造方法,是Python中的又一种魔法方法,也是类中最常用的方法;

__init__() 方法在实例对象创建时自动调用,并实现各类初始化传参、操作;

__init__() 方法重写后添加的形参,如没有默认值,则在创建实例对象时必须填写实参,否则报错;

__init__() 方法只能返回 None,返回其他对象报错。

#创建重写 __init__() 方法的类
class Test:def __init__(self, name, date, times):self.name = nameself.date = dateself.times = timesdef operater(self):print(f'{self.name}在{self.date}去了{self.times}次小卖部!')#创建实例对象时,填入实参,完成初始化
test1 = Test('小明','星期一','5')
test1.name
'小明'
test1.operater()
小明在星期一去了5次小卖部!#创建实例对象时,部分参数未赋值,报错
test2 = Test('小红','2022.1.1')
Traceback (most recent call last):File "<input>", line 1, in <module>
TypeError: __init__() missing 1 required positional argument: 'times'#只能返回 None,返回其他对象报错
class Xtest:def __init__(self):return 'hi'testx = Xtest()
Traceback (most recent call last):File "<input>", line 1, in <module>
TypeError: __init__() should return None, not 'str'

6. 公有/私有属性

一般面向对象编程语言,都会区分公有和私有数据类型;

Python 中默认对象的属性和方法都是公开的,可以直接通过点操作符 '.' 进行访问;为了实现私有变量和函数,Python 采用 Name Mangling(名字改编)技术,做了部分实现;

Python 中的私有变量或函数,即在变量或函数名前加上 '_' 下划线,添加下划线后,变量/函数名外界无法直接访问;

但 Python 采用的 Name Mangling(名字改编),实际上是把 '__变量/函数名',改编为了 '_类名__变量/函数名',实际上仍可以在外部通过后一种格式进行访问,是一种伪私有变量。

#定义包含内部变量和内部函数的类
class Test:__testinfo = 'testinfo'def __testfunc(self):print(f'{self.__testinfo}')#外部直接访问内部变量,失败
test1 = Test()
test1.__testinfo
Traceback (most recent call last):File "<input>", line 1, in <module>
AttributeError: 'Test' object has no attribute '__testinfo'#外部直接访问内部函数,失败
test1.__testfunc()
Traceback (most recent call last):File "<input>", line 1, in <module>
AttributeError: 'Test' object has no attribute '__testfunc'#外部访问改编后的内部变量,成功
test1._Test__testinfo
'testinfo'#外部访问改编后的内部函数,成功
#内部函数可以直接调用内部变量,不需要使用改编后的变量名
test1._Test__testfunc()
testinfo

类和对象1:基础学习相关推荐

  1. 6.java中什么是类_类、对象(java基础知识六)

    1.Java约定俗成 java约定俗成1,类名接口名 一个单词首字母大写,多个单词每个单词首字母都大写2,方法名和变量名 一个单词全部小写,多个单词从第二个单词首字母大写 建议:如果能用英语尽量用英语 ...

  2. 类与对象——python基础datawhale组队学习

    类与对象 1. 对象 = 属性 + 方法 对象是类的实例.换句话说,类主要定义对象的结构,然后我们以类为模板创建对象.类不但包含方法定义,而且还包含所有实例共享的数据. 封装:信息隐蔽技术 我们可以使 ...

  3. java 注解 对象_Java基础-学习使用Annotation注解对象

    Java基础-学习使用Annotation注解对象 注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某 个时刻非常方便地使用这些数据 1-1:基本语法 Java S ...

  4. java类和对象的基础特性

    目录 点击传送>>> 前言: 1.面向对象概述 2.类和对象 1.对象 2.类 3.类的定义格式 1.成员变量(静态部分) 2.成员方法(动态部分) 3.实例化 3.权限修饰符 1. ...

  5. (四)nodejs循序渐进-函数,类和对象(基础篇)

    上一篇文章讲到了基本数据类型和运算符,相信大家都能做简单的运算,本篇文章将讲述函数,类,对象. 函数 在nodejs中,一个函数可以作为另一个函数的参数.我们可以先定义一个函数,然后传递,也可以在传递 ...

  6. java类和对象的基础(笔记)

    在Java类的设计中,有时希望一个类在任何时候只能有一个实例.这时可以将该类设计为单例模式(singleton).要将一个类设计为单例模式,需要把类的构造方法的访问修饰符声明为private,然后在类 ...

  7. OC基础语法(1)—类和对象OC基础语法…

    01-第一个OC程序 //  main.m #include #import #import "One.h" #import "Two.h" // OC和C语言 ...

  8. 2022年Spark基础学习笔记目录

    一.Spark学习笔记 在私有云上创建与配置虚拟机 Spark基础学习笔记01:初步了解Spark Spark基础学习笔记02:Spark运行时架构 Spark基础学习笔记03:搭建Spark单机版环 ...

  9. JAVA基础七 类和对象

    文章目录 JAVA基础七 类和对象 01 引用 02 继承 03 方法重载 04 构造方法 05 this 06 传参 07 包 08 访问修饰符 09 类属性 10 类方法 11 属性初始化 12 ...

  10. JAVA基础––从类和对象开始

    JAVA基础--从类和对象开始 一.概念 1.面向对象中类和对象的概念 对象:对象是具有状态和行为的实体,例如某个具体的学生,或者是王者荣耀里的英雄,可以是物理实体,也可以是逻辑实体. 类:类是一组具 ...

最新文章

  1. java滥用接口_吐槽一下项目中的代码坏味道:滥用java常量
  2. 仿FLASH动感十足鼠标滑过放大的菜单代码
  3. 手机PIN锁死让输入PUK解决方案
  4. @Controller,@Service,@Repository,@Component详解
  5. 【OpenCV 例程200篇】83. 频率域低通滤波:印刷文本字符修复
  6. Oracle数据库SqlLoad常用技巧总结word版
  7. 旷视Face++与西交大成立AI联合实验室,郑南宁孙剑再续师徒缘
  8. java案例代码19--二分查找排序
  9. php毕设周记_(完整版)毕设周记
  10. 必备24个宝藏工具,赶紧收藏,在家做自媒体8天收益4100
  11. Android实现思维导图功能,Android实现思维导图
  12. 2009年10月 档案_39健康博客_benwen520dan
  13. 利润表三点式审阅:以御银股份为例
  14. 小程序各领域的代表出来溜大街了
  15. Hyperledger caliper 安装记录
  16. 视频人像分割算法—C++推理(视频抠图 图片抠图)
  17. 边缘计算的100个术语
  18. 真正毁掉团队的,是“窄化效应”
  19. 进程学习:进程间通信(传统通信方式)1.无名管道
  20. 所见即所得的 markdown 编辑器:Typora

热门文章

  1. 小内存电脑安装linux,在低内存的情况下安装CentOS系统的技巧
  2. 如何解决“数据错误,循环冗余检查”
  3. 电驱系列:直流无刷马达(不用芯片,独立元器件搭建)
  4. 基于STM32和阿里云的智能家居
  5. jenkins基础与gitlab代理自动构建
  6. 杀毒软件需要开源吗?
  7. PyG搭建GCN实现节点分类(GCNConv参数详解)
  8. Git HEAD detached from origin(冲突解决后无法正常push) 问题的解决方案
  9. 使用Python进行Android自动化测试
  10. java Complex 类