python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法

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) #通过类访问实例方法时,必须显式地将实例当做参数传入

原文地址:https://www.cnblogs.com/chenhuabin/p/10055316.html

时间: 2024-10-13 17:29:30

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

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

概念:                                                                                                                                                     ·        面向过程:根据业务逻辑从上到下写垒代码 ·        函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 ·        面向对象:对函数进行分类和封装,

python 类属性 实例属性 类方法 实例方法 静态方法(转载)

本文是转载,纯粹是为了方便后面自己查看,建议还是看原文的:http://www.cnblogs.com/dolphin0520/archive/2013/03/29/2986924.html 一.先来谈一下类属性和实例属性 在前面的例子中我们接触到的就是类属性,顾名思义,类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,这个和C++中类的静态成员变量有点类似.对于公有的类属性,在类外可以通过类对象和实例对象访问. class people: name = 'j

python类方法/实例方法/静态方法

类方法:隐式接收第一个参数为类本身的方法,通过类或实例皆可调用,在类方法定义中不能访问实例属性及调用实例方法,可以访问已定义的类属性和调用已定义的类方法,使用@classmethod装饰器进行定义: 1 class Test(object): 2 @classmethod 3 def method(cls,*args,**kw):#此处cls即代表Test类本身 4 pass 实例方法:隐式接收第一个参数为实例本身的方法,只能通过实例进行调用,在实例方法定义中可以访问自身已定义过的实例属性及类属

python 面向对象(成员,静态,类)的(变量,方法)区别

静态方法是使用@staticmethod装饰的方法,并且参数表中不需要self或者cls,可以访问类成员变量 默认的方法是有self的,是成员方法,可以访问私有变量和方法(通过self.xxx),或者访问类方法或变量(通过类名.方法名或变量名) 类方法使用@classmethod来装饰,参数表中不需要self,但需要cls参数和当前类关联.不能访问成员变量和方法,但是可以通过cls.xxx访问类方法或类变量 一下是参考了网上的一些大神的总结: 静态成员方法: 不能访问类属性,实例属性,相当于一个

Python面向对象之类的封装、继承与多态

Python面向对象中类的三大特性,即封装.继承与多态,同时也是所有语言在面向对象编程中的重要特性,下面用实际的代码部分针对每一种特性做出说明. 一.封装 顾名思义,封装即把我们想要的内容封装到某个地方,因此在这里记录两个问题,一是如何封装.二是如何调用封装的内容. 1.封装数据 class Company:     def __init__(self, dept, leader):         self.dept = dept         self.leader = leader   

python中类对象、实例对象、类属性、实例属性、类方法、实例方法、静态方法

类对象.类属性与实例对象.实例属性的区别 在Python中一切皆是对象,类是一个特殊的对象即类对象,描述类的属性称为类属性.类属性在内存中只有一份,在__init__外部定义. 通过类创建的对象称为实例对象,描述实例对象的属性称为实例属性.实例属性在各自对象的内存中都保存一份,在__init__方法内部定义. 实例方法.类方法.静态方法的区别 这三种方法都是保存在类的内存中,调用者不同. 实例方法由对象调用,至少一个self参数,self代表对象的引用. 类方法有类调用,至少一个cls参数,并且

(一)Python入门-6面向对象编程:02类的定义-类和对象的关系-构造函数-实例属性-实例方法

一:类的定义 如果把对象比作一个“饼干”,类就是制造这个饼干的“模具”. 我们通过类定义数据类型的属性(数据)和方法(行为),也就是说,“类将行为和状态打 包在一起”. 对象是类的具体实体,一般称为“类的实例”.类看做“饼干模具”,对象就是根据这个“模 具”制造出的“饼干”. 从一个类创建对象时,每个对象会共享这个类的行为(类中定义的方法),但会有自己的属 性值(不共享状态).更具体一点:“方法代码是共享的,属性数据不共享”. Python中,“一切皆对象”.类也称为“类对象”,类的实例也称为“

JAVA类与对象---实例变量与类变量的区别,实例方法和类方法的区别

实例变量 实例变量声明在一个类中,但在方法.构造方法和语句块之外: 当一个对象被实例化之后,每个实例变量的值就跟着确定: 实例变量在对象创建的时候创建,在对象被销毁的时候销毁: 实例变量的值应该至少被一个方法.构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息: 实例变量对于类中的方法.构造方法或者语句块是可见的.一般情况下应该把实例变量设为私有.通过使用访问修饰符可以使实例变量对子类可见 实例变量具有默认值.数值型变量的默认值是0,布尔型变量的默认值是false,引用类型变量的默

面向对象之构造函数、实例对象、原型

一.面向对象首先有一个需求,点击按钮改变div的样式.按照常规的思维来写,我们可能是先获取到目标元素,然后给目标元素添加事件,在事件中书写div需要改变的样式属性.如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script type="text