什么是对象和类

https://www.cnblogs.com/poloyy/p/15178423.html

Python 类

类定义语法

最简单的类定义看起来像这样

class ClassName:
<statement-1>
.
.
.
<statement-N>

类定义与函数定义 (def 语句) 一样必须被调用执行才会起作用

类命名空间

  • 当定义类时,会创建一个新的命名空间,也是一个局部作用域
  • 上面的类定义栗子里,statement-1 到 statement-N 就是这个类的命名空间

类的取名建议规则

类名中的所有单词首字母要大写,采用驼峰命名法(例 GameCase )的书写方式

最简单的一个类

class Dog:
pass
  • 这个类没有属性也没有方法
  • 实际应用中,很少会创建空类,因为空类没有任何实际意义

包含属性、方法的一个类

class Person:
def introduce(self):
print('My name is %s, I am %d years old' % (self.name, self.age))

Person 类,有一个方法 introduce,有两个属性 name、age

通过 Person 类创建两个实例对象

# 对象一
tom = Person() # 对象属性
tom.name = 'tom'
tom.age = 10 # 对象二
jerry = Person() # 对象属性
jerry.name = 'jerry'
jerry.age = 20 # 调用对象的方法
tom.introduce()
jerry.introduce() # 输出结果
My name is tom, I am 10 years old
My name is jerry, I am 20 years old

类对象

什么是类对象

  • 声明了一个类,它就是一个类对象
  • 程序运行时,在内存中就会创建一个类对象,有且只有一个
  • 类对象也有自己的属性和方法,分别叫做:类属性、类方法(后面详解)

打印下类对象看看

# 类对象
class person:
pass print(person)
print(id(person)) # 输出结果
<class '__main__.person'>
140485598521200

打印的就是一个类对象和内存地址

类对象支持两种操作

  1. 属性引用
  2. 实例化

属性引用

  • 使用 Python 所有属性引用的标准语法: Obj.name
  • 有效的属性名称是类对象被创建时存在于类命名空间中的所有名称
class MyClass:
"""A simple example class"""
i = 12345 def f(self):
return 'hello world'

有效的属性引用

  • MyClass.i:返回一个整数
  • MyClass.f:返回一个函数对象
  • MyClass.__doc__:返回当前类的文档字符串
print(MyClass.i)
print(MyClass.f)
print(MyClass.__doc__) # 输出结果
12345
<function MyClass.f at 0x10f43f310>
A simple example class

实例化

实例化其实就是调用类对象,从而创建一个实例对象

c = MyClass()

创建类的新实例并将此对象分配给局部变量 c

实例对象

什么是实例对象

  • 通过类实例化操作生成对象就是实例对象
  • 一个类可以多次实例化,生成多个实例对象
# 实例对象
class person:
pass # 实例化:类名()
p1 = person()
p2 = person()
p3 = person()
print(p1, id(p1))
print(p2, id(p2))
print(p3, id(p3)) # 输出结果
<__main__.person object at 0x10e42b8b0> 4534220976
<__main__.person object at 0x10e42b880> 4534220928
<__main__.person object at 0x10e42b850> 4534220880

三个 person 类实例对象,分别有自己独立的内存地址

常说的面向对象编程是什么

  1. 设计类
  2. 创建类实例对象
  3. 实例对象调用方法

创建实例对象详解

  1. 在内存中为对象分配空间
  2. 调用初始化方法  __init__  为对象初始化
  3. 对象创建后,内存中就有一个类的实例对象了

由此可见,一个类可以有很多个对象,每个对象都有属于自己的属性、方法;

  • 创建出来的 对象 叫做 类的 实例对象
  • 创建对象的 行为 叫做 实例化
  • 对象的属性 叫做 实例属性
  • 对象调用的方法 叫做 实例方法

__init__、实例属性、实例方法后续详解

知识点

  • 每个对象都有自己独立的内存空间,保存自己的属性
  • 但是实例方法在内存中都只有一个,实例方法中的 self 就是实例对象的引用,当对象调用实例方法时,会默认把实例对象传给方法内部

如果不懂的话,看看下面代码的输出就知道啦; id() 是用于获取对象的内存地址

class person():
def __init__(self, name):
self.name = name
print(f"init-{self.name} ", id(self)) def test(self):
print(f"test-{self.name} ", id(self)) p1 = person("p1")
print("p1-", id(p1))
print("p1 fun-", id(p1.test)) p2 = person("p2")
print("p2-", id(p2))
print("p2 fun-", id(p2.test)) # 输出结果
init-p1 4435237568
p1- 4435237568
p1 fun- 4435260032 init-p2 4435237472
p2- 4435237472
p2 fun- 4435260032 

可以看到,两个实例对象调用的实例方法是同一个内存地址

Python - 面向对象编程 - 什么是 Python 类、类对象、实例对象的更多相关文章

  1. Python - 面向对象编程 - 类变量、实例变量/类属性、实例属性

    什么是对象和类 https://www.cnblogs.com/poloyy/p/15178423.html 什么是 Python 类.类对象.实例对象 https://www.cnblogs.com ...

  2. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

  3. python面向对象编程(上)

    面向对象编程(OOP,Object Oriented Programming)是每一个高级编程语言都支持的编程方法,比如JAVA/C++/C#等等.学习面向对象编程是每一个程序员都绕不开的重点内容. ...

  4. python 面向对象编程(一)

    一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...

  5. Python面向对象编程指南

    Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...

  6. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

  7. python 面向对象编程(初级篇)

    飞机票 概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最 ...

  8. Python面向对象编程(下)

    本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...

  9. python面向对象编程练习

    练习题 1.面向对象三大特性,各有什么用处,说说你的理解. 面向对象的三大特性: 1.继承:解决代码的复用性问题 2.封装:对数据属性严格控制,隔离复杂度 3.多态性:增加程序的灵活性与可扩展性 2. ...

随机推荐

  1. UBUNTU 16.04 LTS SERVER 手动升级 MariaDB 到最新版 10.2

    UBUNTU 16.04 LTS SERVER 手动升级 MariaDB 到最新版 10.2 1. 起因 最近因为不同软件的数据问题本来只是一些小事弄着弄着就越弄越麻烦了,期间有这么个需求,没看到有中 ...

  2. windows系统下 PHP怎么安装redis扩展

    在windows系统下安装redis就不赘述了,基本上就是下一步,下一步. 然后通过通过命令行启动服务. 我是在xamp 3.2.2的集成环境下进行本地redis扩展安装配置的,php的版本是5.6. ...

  3. etcd学习(4)-centos7中部署etcd

    etcd的搭建 前言 单机 集群 创建etcd配置文件 更新etcd系统默认配置 启动 配置ETCD为启动服务 测试下 参考 etcd的搭建 前言 这里记录下如何搭建etcd 单机 在etcd的rel ...

  4. [IOI2005]mea

    IOI 读完题,感觉这个题并不是很难,那我是不是可以去IOI了: 最先考虑暴力,发现完全行不通,所以,我们考虑其他方法.突然发现:其实在确定 \(s_1\) 的时候,整个序列就可以确定了,所以我们考虑 ...

  5. SetupDi系列函数

    SetupDiClassGuidsFromName WINSETUPAPI BOOL SetupDiClassGuidsFromNameA( PCSTR ClassName, LPGUID Class ...

  6. jvm源码解读--18 Java的start()方法解读 以及 wait 和notify流程图

    drawwed by 张艳涛 and get info from openjdk8 还有一个图

  7. 🏆【Java技术专区】「探针Agent专题」Java Agent探针的技术介绍(1)

    前提概要 Java调式.热部署.JVM背后的支持者Java Agent: 各个 Java IDE 的调试功能,例如 eclipse.IntelliJ : 热部署功能,例如 JRebel.XRebel. ...

  8. 【LeetCode】297. 二叉树的序列化与反序列化

    297. 二叉树的序列化与反序列化 知识点:二叉树:递归 题目描述 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一 ...

  9. Hadoop 3.1.1 - 概述 - 总览

    Apache Hadoop 3.1.1 和之前发布的 3.0.X 版本线相比,Apache Hadoop 3.1.1 吸收了许多重要的改进. 总览 建议用户阅读完整的版本说明.本文提供了对主要变动的总 ...

  10. Go测试技术分享(一):场景化接口Case编写

    一.前言 本人负责的支付清结算方向的测试工作,在测试项目中,会出现流程化的接口调用,请求完一个接口后,继续请求另一个接口(这里的接口可以指Http,也指rpc接口),这里以一个真实场景为例:用户在平台 ...