Python之关于类变量的两种赋值区别详解

我就废话不多说了,还是直接看代码吧!

# -*- coding:utf-8 -*-
#面试题,写一个方法,将一行字符串中所有的单词数量统计出来

class Person(object):
 TAG = "hello"

p1 = Person()
p2 = Person()

print p1.TAG #第一种赋值方式
print p2.TAG
print Person.TAG #第二种赋值方式

p1.TAG = "damn it"

print p1.TAG
print p2.TAG
print Person.TAG

输出结果:可以看到,只有p1的TAG,被赋值成了新的"damn it"

hello
hello
hello
damn it
hello
hello

如何将所有对象引用的类变量都赋值成同一个值呢?

Person.TAG = "damn it"

输出结果:完美解决问题

hello
hello
hello
damn it
damn it
damn it

补充知识:python类,赋值,命名空间

python中的类相当于一个命名空间,object.attr 就是一个向上爬属性的过程

属性:__dict__ , __class__ , __bases__

__dict__: 实例或类或模块的属性 , __class__ 实例对应的类对象,__bases__(元组):父类/超类

爬属性:

def findAttr(obj , attr):
 if attr in obj.__dict__:
  return obj.__dict__[attr]
 cls = obj.__class__
 if attr in cls.__dict__:
  return cls.__dict__[attr]
 for super_cls in cls.__bases__:
  if attr in super_cls.__dict__:
   return super_cls.__dict__[attr]
 return None

爬类:

def classTree(cls,indent):
 print('.'*indent + cls.__name__)
 for super_cls in cls.__bases__:
  classTree(super_cls,indent+4)

赋值方式:

class Test:
 static_var = 1 #类属性相当与C++静态成员变量
 def assign(self):
  self.x = 1 #对象属性赋值

t = Test()
t.x = 2 #也可以这样 ,直接赋值
t.__dict__['x'] = 3 #也可以这样 , __dict__是对象空间词典,每个对象一份,类对象/模块也有
Test.add_static_var = 5 #也可以样新增一个类属性

类方法调用 , 常用的方式object.method() ,在python中扩展 Class.method(object) ,两者相同

Test.assign(t)
print(t.x)

当object.method() 时,object被传入method(self)中的第一个参数.Class.method(object) 需要手动传入

命名空间:

x = 0
def print_global():
 print(x) #打印全局
def print_local():
 x = 1
 print(x) #本地变量
class A:
 x = 2 #类属性==C++静态成员变量 , print A.x
 def m(self):
  x = 3   #本地变量
  self.x = 4 #对象属性
def change_global():
 global x  #修改全局变量,否则x = 100 ,是增加一个本地变量
 x = 100
def print_enclosing():
 x = 200
 def nested():
  print(x)  #在闭包中引用本地变量
def change_in_enclosing():
 x = 1
 def nested():
  nonlocal x
  x = 2   #在闭包中改变本地变量, 如没有nonlocal x , 在又新增一个本地变量

以上这篇Python之关于类变量的两种赋值区别详解别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 对python 中class与变量的使用方法详解

    python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding:utf-8 global_variable_1 = 'global_variable' class MyClass(): class_var_1 = 'class_val_1' # define class variable here def __init__(self, param): self

  • 详细解析Python中的变量的数据类型

    变量是只不过保留的内存位置用来存储值.这意味着,当创建一个变量,那么它在内存中保留一些空间. 根据一个变量的数据类型,解释器分配内存,并决定如何可以被存储在所保留的内存中.因此,通过分配不同的数据类型的变量,你可以存储整数,小数或字符在这些变量中. 变量赋值: Python的变量不必显式地声明保留的存储器空间.当分配一个值给一个变量的声明将自动发生.等号(=)来赋值给变量. 操作数=操作符的左边是变量,操作数=操作符的右侧的名称在变量中存储的值.例如: #!/usr/bin/python cou

  • python关于变量名的基础知识点

    变量名 1.组成:数字.字母.下划线 2.变量名要有意义 3.多个单词则用下划线,如user_id 4.python的变量名不要驼峰显示 字符串: 1.引号内的都称为 字符串 2.常用引号:' '," ",'' '',"" "",''' ''', """ """ 3.支持运算:+,* 数值: 1.支持运算:+,-,*,/,**(指数),%(取余数),//(取商) 如:3**4=81 5%

  • Python之关于类变量的两种赋值区别详解

    我就废话不多说了,还是直接看代码吧! # -*- coding:utf-8 -*- #面试题,写一个方法,将一行字符串中所有的单词数量统计出来 class Person(object): TAG = "hello" p1 = Person() p2 = Person() print p1.TAG #第一种赋值方式 print p2.TAG print Person.TAG #第二种赋值方式 p1.TAG = "damn it" print p1.TAG print

  • python文件读取read及readlines两种方法使用详解

    目录 引言 .read([size])方法 .readlines()方法 引言 with open() as 和open()都是打开,还没有读入文件 假设test.fa的内容如下图所示: ACGACGTAGCGTAGCTACGATCAGCGACGAGCTAGCGACGA .read([size])方法 read([size])方法从文件当前位置起读取size个字节,若无参数size,则表示读取至文件结束为止,它返回字符串对象. with open('test.fa') as fa: f = fa

  • IOS自带Email的两种方法实例详解

    IOS自带Email的两种方法实例详解 IOS系统框架提供的两种发送Email的方法:openURL 和 MFMailComposeViewController.借助这两个方法,我们可以轻松的在应用里加入如用户反馈这类需要发送邮件的功能. 1.openURL 使用openURL调用系统邮箱客户端是我们在IOS3.0以下实现发邮件功能的主要手段.我们可以通过设置url里的相关参数来指定邮件的内容,不过其缺点很明显,这样的过程会导致程序暂时退出.下面是使用openURL来发邮件的一个小例子: #pr

  • JSP 获取用户的真实IP两种实现方法详解

    JSP 获取用户的真实IP两种实现方法详解 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了 Apache,Nagix等反向代理软件就不能获取到客户端的真实IP地址了.如果使用了反向代理软件,用 request.getRemoteAddr()方法获取的IP地址是:127.0.0.1或 192.168.1.110,而并不是客户端的真实IP. 经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿

  • MySql安装启动两种方法教程详解

    mysql安装启动两种方法如下所示: 方法一(简单版): 1.cmd进入mysql安装的bin目录:mysqld.exe –install 2.net start mysql 服务启动(或者选择计算机->(右键)管理->服务和应用程序->服务->mysql右键启动服务) 3.mysql –uroot –p 回车 4.password留空 回车 方法二: 1.cmd进入到mysql安装目录bin,如:D:\MySQL Server 5.6\bin 2.mysqld --console

  • 基于String变量的两种创建方式(详解)

    在java中,有两种创建String类型变量的方式: String str01="abc";//第一种方式 String str02=new String("abc")://第二种方式 第一种方式创建String变量时,首先查找JVM方法区的字符串常量池是否存在存放"abc"的地址,如果存在,则将该变量指向这个地址,不存在,则在方法区创建一个存放字面值"abc"的地址. 第二种方式创建String变量时,在堆中创建一个存放&q

  • Android判断后台服务是否开启的两种方法实例详解

    Android判断后台服务是否开启的两种方法实例详解 最近项目用到后台上传,就开启了一个服务service. 但是刚开始用这种方法,有些机型不支持:酷派不支持.然后又换了第二种判断方法. // public boolean isServiceWork(Context mContext, String serviceName) { // boolean isWork = false; // ActivityManager myAM = (ActivityManager) mContext // .

  • ubuntu 16.04安装redis的两种方式教程详解(apt和编译方式)

    ubuntu 16.04安装redis的两种方式教程如下所示: 方式一 :apt安装 在 Ubuntu 系统安装 Redi 可以使用以下命令: $sudo apt-get update $sudo apt-get install redis-server 启动 Redis $ redis-server 查看 redis 是否启动? $ redis-cli 以上命令将打开以下终端: redis 127.0.0.1:6379> 127.0.0.1 是本机 IP ,6379 是 redis 服务端口.

  • Spring加载properties文件的两种方式实例详解

    在项目中如果有些参数经常需要修改,或者后期可能需要修改,那我们最好把这些参数放到properties文件中,源代码中读取properties里面的配置,这样后期只需要改动properties文件即可,不需要修改源代码,这样更加方便.在Spring中也可以这么做,而且Spring有两种加载properties文件的方式:基于xml方式和基于注解方式.下面分别讨论下这两种方式. 1. 通过xml方式加载properties文件 我们以Spring实例化dataSource为例,我们一般会在beans

  • java 实现websocket的两种方式实例详解

    一.介绍 1.两种方式,一种使用tomcat的websocket实现,一种使用spring的websocket 2.tomcat的方式需要tomcat 7.x,JEE7的支持. 3.spring与websocket整合需要spring 4.x,并且使用了socketjs,对不支持websocket的浏览器可以模拟websocket使用 二.方式一:tomcat 使用这种方式无需别的任何配置,只需服务端一个处理类, 服务器端代码 package com.Socket; import java.io

随机推荐