返回顶部
首页 > 资讯 > 后端开发 > Python >python 面向对象之变量
  • 286
分享到

python 面向对象之变量

变量面向对象python 2023-01-30 21:01:32 286人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。实例变量:定义在方法中的变量,只作用于当前实例的类。类变量的用途?大家公共的属性,节省开销看下面一段代码class Role

类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。

实例变量:定义在方法中的变量,只作用于当前实例的类。


类变量的用途?

大家公共的属性,节省开销


看下面一段代码

class Role(object): #类名
    n1 = 123 #类变量
    # 构造函数,在实例化时做一些类的初始化工作
    def __init__(self, ...):
        #实例变量(静态属性),作用域就是实例本身
        self.name = name
        pass

    def shot(self): #类的方法(动态属性)
        print("shooting...")

r1 = Role('Jack',...) #Role对象的实例
r2 = Role('Rore',...)

r1的name变量是不能给r2使用的,因为作用域只能是实例本身


类变量和实例变量的区别

class Role(object):
    n = 123
    def __init__(self, name):
        self.name = name

    def shot(self):
        print("shooting...")

#打印类变量
print(Role.n)

执行输出:123


从这段代码可以看出,类还没有实例化,就可以直接打印类变量了。那么类变量存在哪里呢?

是存在类的内存里面

class Role(object):
    n = 123
    def __init__(self, name):
        self.name = name

    def shot(self):
        print("shooting...")

r1 = Role('jack')
r2 = Role('rose')

print(r1.n,r1.name)
print(r2.n,r2.name)

执行输出:

123 jack

123 rose


可以看出,实例化之后,也可以打印类变量


在类里面定义个同名变量name

class Role(object):
    n = 123
    name = "我是类name"
    def __init__(self, name):
        self.name = name

    def shot(self):
        print("shooting...")

r1 = Role('jack')
r2 = Role('rose')

print(r1.n,r1.name)
print(r2.n,r2.name)

执行输出:

123 jack

123 rose


为什么新定义的name变量,没有打印出来呢?

因为优先级不一样,实例化之后,先找实例本身的,如果找不到,就去类里面找。

从上面例子可以看出,name是在实例本身的,输出jack

n不在实例本身里面,所以从类里面找到了n,输出123


实例变量优先于类变量


实例化之后,可不可修改实例变量呢?当然可以啊,请看下面的例子

class Role(object):
    n = 123
    name = "我是类name"
    def __init__(self, name):
        self.name = name

    def shot(self):
        print("shooting...")

r1 = Role('jack')
#修改实例变量
r1.name = "Newton"

print(r1.n,r1.name)

执行输出:

123 Newton


实例化之后,还可以增加一个变量

class Role(object):
    n = 123
    name = "我是类name"
    def __init__(self, name):
        self.name = name

    def shot(self):
        print("shooting...")

r1 = Role('jack')
#修改实例变量
r1.name = "Newton"
#增加实例变量
r1.age = 21

print(r1.n,r1.name,r1.age)

执行输出:

123 Newton 21


实例化之后,是做什么事情呢?

比如 r1 = Role('jack')

就相当于

def __init__(self, name):
    self.name = name #相当于r1.name = name

把name传给了实例

所增加变量的时候,也同样是给实例做了赋值操作

r1.age = age


删除一个实例变量

class Role(object):
    n = 123
    name = "我是类name"
    def __init__(self, name):
        self.name = name

    def shot(self):
        print("shooting...")

r1 = Role('jack')
#修改实例变量
r1.name = "Newton"
#增加实例变量
r1.age = 21
#删除实例变量
del r1.age

print(r1.n,r1.name,r1.age)

执行报错

AttributeError: 'Role' object has no attribute 'age'


修改类变量

class Role(object):
    n = 123
    name = "我是类name"
    def __init__(self, name):
        self.name = name

    def shot(self):
        print("shooting...")

r1 = Role('jack')
r2 = Role('rose')
#修改类变量
r1.n = "改变变量"

print(r1.n,r1.name)
print(r2.n,r2.name)

执行输出:

改变变量 jack

123 rose


为什么r2没有改变呢?

是因为r1实例化之后,执行了r1.n = "改变变量",就相当于在r1实例里面,加了一个实例变量n = "改变变量"

它和类变量n=123不是同一个,虽然是同名的,根据查询原则,优先查找实例变量,再去找类变量。

所以输出了

改变变量 jack


r2实例化之后,去查找变量n,发现没有,就去类变量找,最后输出

123 rose


下面升级一下,直接修改类变量,再查看r1和r2 n的值

class Role(object):
    n = 123
    name = "我是类name"
    def __init__(self, name):
        self.name = name

    def shot(self):
        print("shooting...")

r1 = Role('jack')
r2 = Role('rose')
#修改类变量
r1.n = "改变变量"
#不实例化,直接修改类变量
Role.n = "ABC"

print(r1.n,r1.name)
print(r2.n,r2.name)

执行输出:

改变变量 jack

ABC rose


为什么r2的n变量改了,r1的没有改呢?

是因为r1的n变量,是实例变量,优先级高于类变量,所以输出时,不受影响。


class Role(object):
    n = 123
    n_list = []
    name = "我是类name"
    def __init__(self, name):
        self.name = name

    def shot(self):
        print("shooting...")

r1 = Role('jack')
r2 = Role('rose')
#修改类变量
r1.n = "改变变量"
#不实例化,直接修改类变量
Role.n = "ABC"
#增加一个列表元素
r1.n_list.append("from r1")
r2.n_list.append("from r2")
#打印r1,r2,类 变量n_list
print(r1.n,r1.n_list)
print(r2.n,r2.n_list)
print(Role.n_list)

执行输出:

改变变量 ['from r1', 'from r2']

ABC ['from r1', 'from r2']

['from r1', 'from r2']


发现n_list都是一样的,为什么呢?因为n_list的内存变量地址是一样的。所以有一个修改了,那么其他的都生效。



--结束END--

本文标题: python 面向对象之变量

本文链接: https://lsjlt.com/news/179010.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python 面向对象之变量
    类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。实例变量:定义在方法中的变量,只作用于当前实例的类。类变量的用途?大家公共的属性,节省开销看下面一段代码class Role...
    99+
    2023-01-30
    变量 面向对象 python
  • Python面向对象之面向对象基本概念
    面向过程和面向对象概念 过程和函数:过程类似于函数,只能执行,但是没有返回结果;函数不仅能执行,还能返回结果。 面向过程和面向对象 基本概念 面向过程-怎么做 把完成某一个需求的所有步骤从头到尾逐步实现; 根据开发需求,将某些功能独立的...
    99+
    2023-01-31
    面向对象 基本概念 Python
  • Python面向对象之类和对象
    目录类定义类定义类和属性类中方法对象方法(普通方法)类方法静态方法魔术方法对象创建对象对象属性总结 类 定义类 所有类名首字母要求大写,多个单词时遵循驼峰命名法 所...
    99+
    2024-04-02
  • python 面向对象之继承
    文章目录 前言继承的概念单继承多继承子类重写父类的同名方法和属性子类调用父类同名的方法和属性多层继承私有权限 前言 前面我们已经学习了 python 面向对象的类和对象,那么今天我将为大...
    99+
    2023-09-01
    python 开发语言
  • python 面向对象之多态
    多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。那么,多态的...
    99+
    2023-01-30
    面向对象 多态 python
  • python之初始面向对象
    1. 初识面向对象   面向过程:     一切以事务的发展流程为中心.   面向对象:     一切以对象为中心. 一切皆为对象. 具体的某一个事务就是对象 2. 类. 对象 ...
    99+
    2023-01-30
    面向对象 python
  • python之成员(面向对象)
    1. 成员   在类中你能写的所有内容都是类的成员    class Person: def __init__(self, name, gender): self.name = name # 成员...
    99+
    2023-01-30
    面向对象 成员 python
  • python之路day06 面向对象
    面向对象(你就是上帝): 世间万物,皆可分类 世界万物,皆为对象 https://www.cnblogs.com/alex3714/articles/5188179.html 面向对象编程 OOP编程是利用“类”和“对象”来创建各种模型来...
    99+
    2023-01-30
    之路 面向对象 python
  • python面向对象之反射
    一、静态方法(staticmethod)和类方法(classmethod)类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属×××互(也就是可以使用类属性)静态方法:让类里的方法直接被类调用,就像正常调用函数一样类方法和静态方...
    99+
    2023-01-31
    反射 面向对象 python
  • Python面向对象之入门类和对象
    目录什么是面向对象编程?定义类,从具体代码来感受吧!多个类和对象的观察补充一下类的属性(数据部分)总结什么是面向对象编程? 我们是不是听过面向过程,拿来放在一起对比就比较好理解了。 ...
    99+
    2024-04-02
  • python 面向对象之类方法
    类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量举个例子class Dog(object):     def __i...
    99+
    2023-01-30
    面向对象 方法 python
  • 【python】面向对象编程之@prop
      @property装饰器作用:把一个方法变成属性调用 使用@property可以实现将类方法转换为只读属性,同时可以自定义setter、getter、deleter方法   @property&@.setter class ...
    99+
    2023-01-31
    面向对象 python prop
  • python面向对象之类成员
    一、概述       上篇《python面向对象OOP》介绍了python面向对象的基础初级入门部分,提到了类的定义,使用,类的三大特性;经典类,新式类在查找时的区别等,有了前面的基础,本文接着描述面向对象中类成员;先整体描述下,类中的成员...
    99+
    2023-01-31
    面向对象 成员 python
  • JavaScala之面向对象
    目录Scala包:基础语法:Scala包的三大作用:包名的命名规范:写包的好处:包对象:导包说明:类和对象:定义类:封装:构造器:主从构造器的加载机制:继承:基础语法:抽象属性:多态...
    99+
    2023-05-15
    Java Scala面向对象 Java Scala
  • python 面向对象、类、对象
    class 类 object 对象 object-oriented programming 面向对象,简称OOP attribute 属性 method 方法 inheritance 继承 python中通过类和对象来实现 ...
    99+
    2023-01-31
    面向对象 对象 python
  • python 面向对象
    面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序...
    99+
    2023-01-30
    面向对象 python
  • python面向对象
    python面向对象 目录: 1.类的定义和使用 2.类的封装 3.类的继承 4.多态   1.类的定义和使用 查、增加、修改、删除、初始化方法、实例化 __init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这...
    99+
    2023-01-30
    面向对象 python
  • Python|面向对象
    #一、类、对象定义及使用 #定义类语法:class 类名(父类):代码块注意:()可有可无 #class Student: #class Student(): #创建对象(实例)语法:对象名=类名() 注意:Java语言在实例化对...
    99+
    2023-01-30
    面向对象 Python
  • python - 面向对象
    #python面向对象 - 类定义   注意:特殊方法"__init__"前后分别有两个下划线!!!   __init__方法可以理解成定义属性的方法,编辑器中会默认将属性都绑定到self中,在使用时直接self.shuxing 即可哟;...
    99+
    2023-01-31
    面向对象 python
  • Python基础之面向对象基础
    面向对象编程(Object-Oriented Programming,简称OOP)是一种编程思想,它将程序中的数据和操作封装成对象,...
    99+
    2023-09-23
    Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作