1. 类对象和实例对象

  Python中一切皆对象,Python类本身也是一种对象,类定义完成后,会在当前作用域中定义一个以类名为名字的命名空间。类对象具有以下两种操作:

  • 可以通过“类名()”的方式实例化一个对象。
  • 可以通过“类名.类属性”的方式来访问一个类属性。

  如果说类时一种概念性的定义,是一种类别,那么实例对象就是对这一类别的具体化、实例化,即实例化对象是类对象实例化之后的产物。

class Person:# 声明一个类对象

    pass

p1 = Person()#声明一个实例对象

print(Person)#输出结果:<class '__main__.Person'>

print(p1)#<__main__.Person object at 0x0000015F7F94D0F0>

2 类变量与实例变量

2.1 概念上的区别

  类变量是指是指该类的所有实例说共有的数据,实例变量是该类每一个实例所特有的数据。这么说的话可能还是很抽象,我们拿人类(Person类)来打比方,人类能移动(move=True),这是每一个人(张三、李四)都能做的,所以我们可以说人类能移动,张三能移动,李四也能移动,这里的移动(move)就是一个类变量。但每一个人都可能有不同的姓名(name)和年龄(age),张三可能20岁,李四可能30岁,但是我们不能说人类(Person)都是20岁或30岁,这里的姓名(name)和年龄(age)就是实例变量。

class Person:

    move = True    # 这是类变量

    def __init__(self , name , age):

        self.name = name  # 这是实例变量

        self.age = age  # 这是实例变量

2.2 声明上的区别

  类变量声明通常在类内部,但函数体外,不需要用任何关键字修饰。实例变量一般声明在实例方法内部(其他方法内部也不行),且用self关键字修饰。

class Person:

    move = True    # 这是类变量,

    def __init__(self , name):

        self.name = name  # 这是实例变量,必须声明在实例函数内,用self关键字修饰

        # move = True  # 类变量不能再函数体内声明,在这个位置声明的又没有self关键字修饰,只能是一个局部变量

    # self.age = age  # 这是错误的,实例变量不能再这里声明

   eat = True  # 这是类变量,可以在函数体外,类内部任意位置

  上面的变量绑定都是在对象声明过程中绑定的,但事实上类变量和实例变量都可以在类或者实例都可以在对象声明结束之后再绑定。“类名.变量名”绑定的是类变量,“实例名.变量名”绑定的是实例变量。

class Person:

    move = True   

    def __init__(self , name , age):

        self.name = name 

        self.age = age 

p1 = Person('张三' , 20)

p1.gender='男' # 声明实例对象结束之后再绑定一个实例变量

Person.eat = True  # 声明类对象结束之后再绑定一个类变量

print(p1.gender)  # 输出结果:男

print(p1.eat)  #输出结果:True

  注:虽然可以在对象声明之后再绑定对象,但是这种方式最好不要使用。

2.3 访问上的区别

  类变量可以通过“类名.变量名”和“实例名.变量名”的方式访问。实例变量只能通过“实例名.变量名”的方式来访问。

class Person:

    move = True    # 这是类变量

    def __init__(self , name , age):

        self.name = name  # 这是实例变量

        self.age = age  # 这是实例变量

p1 = Person('张三' , 20)

print(p1.name  , p1.age) # 通过“实例名.变量名”的方式访问实例变量

print(p1.move) # 通过“实例名.变量名”的方式访问实例变量

print(Person.move)  # 通过“类名.变量名”方式访问类变量

# print(Person.name) # 这是错误的

  注:虽然可以通过“实例名.类变量名”的方式访问类变量,但是并不推荐,最好还是通过“类名.类变量名”来访问类变量。

2.4 存储上的区别

  类变量只会在用class关键字声明一个类时创建,且也只会保存在类的命名空间中,这个类的实例的命名空间中是没有的。通过“实例名.类变量名”访问类变量时,实际访问的是类命名空间中数据,所以所有实例访问到的数据都是同一个变量。实例变量保存在实例各自的命名空间中。

class Person:

    move = True    # 这是类变量

    def __init__(self , name , age):

        self.name = name  # 这是实例变量

        self.age = age  # 这是实例变量

p1 = Person('张三' , 20)

p2 = Person('李四' , 30)

# 通过id()函数查询move内存地址

print(id(p1.move))   # 输出结果为:1622667424

print(id(p1.move))   # 输出结果为:1622667424

3 静态方法、类方法、实例方法

3.1 静态方法

  静态方法是指在定义时,使用@staticmethod装饰器来修饰,无序传入self或cls关键字即可进行创建的方法。在调用过程时,无需将类实例化,直接通过“类名.方法名()”方式调用方法。当然,也可以在实例化后通过“实例名.方法名()”的方式调用。在静态方法内部,只能通过“类名.类变量名”的方式访问类变量。

class Person:

    move = True

    def __init__(self , name , age):

        self.name = name

        self.age = age

    @staticmethod

    def static_fun(): # 声明一个静态方法

        print(Person.move)

p1 = Person('张三' , 20)

p1.static_fun() #输出结果:这是静态方法

Person.static_fun() #输出结果:这是静态方法

3.2 类方法

  类方法需要使用@classmethod装饰器来修饰,且传入的第一个参数为cls,指代的是类本身。类方法在调用方式上与静态方法相似,即可以通过“类名.方法名()”和“实例名.方法名()”两种方式调用。但类方法与静态方法不同的是,类方法可以在方法内部通过cls关键字访问类变量。在类方法内部,既能通过“类名.类变量名”的方式访问类变量,也能通过“cls.类变量名”的方式访问类变量。

class Person:

    move = True

    def __init__(self , name , age):

        self.name = name

        self.age = age

    @classmethod

    def class_fun(cls): # 声明一个类方法

        print(cls.move)

        print(Person.move)# cls 指的就是Person类,等效

p1 = Person('张三' , 20)

p1.class_fun() #输出结果:True True

Person.class_fun() #输出结果:True True

3.3 实例方法

  在一个类中,除了静态方法和类方法之外,就是实例方法了,实例方法不需要装饰器修饰,不过在声明时传入的第一个参数必须为self,self指代的就是实例本身。实例方法能访问实例变量,静态方法和类方法则不能。在实例方法内部只能通过“类名.类变量名”的方式访问类变量。在调用时,实例方法可以通过“实例名.实例方法名”来调用,如果要通过类来调用,必须必须显式地将实例当做参数传入。

class Person:

    move = True

    def __init__(self , name , age):

        self.name = name

        self.age = age

    def instance_fun(self): # 声明一个实例方法

        print(Person.move) # 访问类变量

        print(self.name , self.age)

p1 = Person('张三' , 20)

p1.instance_fun()

Person.instance_fun(p1) #通过类访问实例方法时,必须显式地将实例当做参数传入

python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法的更多相关文章

  1. python面向对象学习(六)类属性、类方法、静态方法

    目录 1. 类的结构 1.1 术语 -- 实例 1.2 类是一个特殊的对象 2. 类属性和实例属性 2.1 概念和使用 2.2 属性的获取机制 3. 类方法和静态方法 3.1 类方法 3.2 静态方法 ...

  2. Python面向对象基础:设置对象属性

    用类存储数据 类实际上就是一个数据结构,对于python而言,它是一个类似于字典的结构.当根据类创建了对象之后,这个对象就有了一个数据结构,包含一些赋值了的属性.在这一点上,它和其它语言的struct ...

  3. python 面向对象编程、获取对象信息

    面向对象与面向过程 参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0 ...

  4. Python 面向对象(创建类和对象,面向对象的三大特性是指:封装、继承和多态,多态性)

    概念:                                                                                                 ...

  5. python面向对象(类与对象)

    面向对象思想 关注公众号"轻松学编程"了解更多. 1.面向对象的设计思想 面向对象是基于万物皆对象这个哲学观点. 2.面向对象和面向过程的区别 面向过程 在生活中: 它是一种看待问 ...

  6. 『无为则无心』Python面向对象 — 57、类属性和实例属性

    目录 1.类属性 (1)类属性的访问 (2)修改类属性 2.类属性和实例属性区别 1.类属性 (1)类属性的访问 类属性就是 类对象 所拥有的属性,它被 该类的所有实例对象 所共有. 类属性可以使用 ...

  7. python -- 面向对象编程(类、对象)

    一.类 类是用来描述具有相同的属性和方法的对象的集合. 它定义了该集合中每个对象共同拥有的属性和方法. 类是一个独立的单位,它有一个类名,其内部包括成员变量和成员方法,分别用于描述对象的属性和行为. ...

  8. Python - 面向对象编程 - 什么是对象和类

    面向对象编程 Object Oriented Programming,简称 OOP,是一种程序设计思想 OOP 把对象作为程序的基本单元,一个对象包含了数据和操作数据的方法 Python里面有一句话: ...

  9. Python面向对象高级编程:__slot__(给实例添加方法、属性)

    纲要: 本章总的来说是给实例添加属性,给类添加方法两个主题,以及相应的作用范围.总结如下: 1.给实例添加属性(作用范围:当然是只对当前实例有效): 2.用__slots__限制可以给实例添加的属性( ...

随机推荐

  1. shell学习1---基本的shell命令

    基本脚本 反引号: ``  反引号里面的内容是命令行,通过反引号用户可以将shell命令的输出赋给变量,比如: test=`date +%y%m%d` echo "The time is : ...

  2. dubbo Filter

    官方说明: 调用拦截扩展 扩展说明 服务提供方和服务消费方调用过程拦截,Dubbo 本身的大多功能均基于此扩展点实现,每次远程方法执行,该拦截都会被执行,请注意对性能的影响. 约定: 用户自定义 fi ...

  3. 谈谈动态地加载Jquery库文件的方法

    有时候,我们可能不会在网页中<script src="jquery.min.js" 来加载 Jquery 库,可能在用户点击某个按钮后,才去加载 Jquery 库. 好处不用 ...

  4. HDU 2391 Filthy Rich (dp)

    题目连接 Problem Description They say that in Phrygia, the streets are paved with gold. You're currently ...

  5. TC-572-D1L2 未完!待续!

    题目描述 • 有一个神秘的常数 K ,s 位• 现在有 n 个 s 位数,告诉你每个数与 K 有多少位是相同的• 判断 K 的无解.多解.唯一解,并求出唯一解(如果存在的话)• 所有出现的数都允许前导 ...

  6. 59、synchronized同步代码块

    synchronized同步方法的问题 有些情况下,在方法上面加synchronized同步,会有性能问题.请看下面代码,来计算下两个线程执行的耗时: package com.sutaoyu.Thre ...

  7. sru源码--language model

    import sys import os import argparse import time import random import math import numpy as np import ...

  8. 【CTF MISC】文件内容反转方法-2017世安杯CTF writeup详解

    Reverseme 用winhex打开,发现里面的字符反过来可以正常阅读,所以文件被倒置了 Python解题程序如下 with open('reverseMe','rb') as f: with op ...

  9. MySQL增量备份与恢复实例【转】

    小量的数据库可以每天进行完整备份,因为这也用不了多少时间,但当数据库很大时,就不太可能每天进行一次完整备份了,这时候就可以使用增量备份.增量备份的原理就是使用了mysql的binlog日志.本次操作的 ...

  10. python操作mysql(pymysql + sqlalchemy)

    pymysql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同. 下载安装 pip3 install pymysql 使用操作 1.执行sql #!/usr/bi ...