类属性和对象属性的定义

class LearnClass():
#类属性
cls_attr = None
def __init__(self,arg):
#对象属性
self.obj_attr = arg object = LearnClass("test")

特性:对象的属性不能通过类来访问,类的属性可以通过对象来读,一但对象进行类属性的写操作时就是对象自己有了复制了这个属性的副本到对象自己。

通过类进行类属性的访问

LearnClass.cls_attr       #通过类访问进行读写都可以且修改对于这个类及类的对象(读)都立马可见
print(object.cls_attr) #仅能读,一旦对象写这个属性就是先复制一个副本到对象自己然后写自己的副本

代码验证

class learn_cls():
cls_attr = 0
def __init__(self,objname,id):
self.name = objname
self.obj_attr = id
def show(self):
print(("%s cls_attr = "% self.name),self.cls_attr)
print("cls_attr= ",learn_cls.cls_attr)
print(("%s cls_attr AT: "% self.name),id(self.cls_attr))
print("cls_attr AT: ",id(learn_cls.cls_attr)) obj1 = learn_cls("obj1","1")
obj2 = learn_cls("obj2","2") print("-----------------------------------------")
obj1.show()
print("=========================================")
obj2.show()
print("-----------------------------------------") print("--------------------Write----------------")
learn_cls.cls_attr = 2
obj1.show()
obj2.show()
print("=========================================")
obj1.cls_attr = 3
obj1.show()
print("=========================================")
obj2.cls_attr = 4
obj2.show()
print("-----------------------------------------")
#run ouput
"""
-----------------------------------------
obj1 cls_attr = 0
cls_attr= 0
obj1 cls_attr AT: 8791389037360 #注意这里的输出1
cls_attr AT: 8791389037360
=========================================
obj2 cls_attr = 0
cls_attr= 0
obj2 cls_attr AT: 8791389037360 #注意这里的输出2
cls_attr AT: 8791389037360
-----------------------------------------
--------------------Write----------------
obj1 cls_attr = 2
cls_attr= 2
obj1 cls_attr AT: 8791389037424
cls_attr AT: 8791389037424
obj2 cls_attr = 2
cls_attr= 2
obj2 cls_attr AT: 8791389037424
cls_attr AT: 8791389037424
#这里的打印说明对类属性访问对与类的对象是全部立马可见的
=========================================
obj1 cls_attr = 3
cls_attr= 2
obj1 cls_attr AT: 8791389037456
cls_attr AT: 8791389037424
#这里已经可以说明通过类的对象访问类的属性的时候,已经是访问的是类自己的副本了
=========================================
obj2 cls_attr = 4
cls_attr= 2
obj2 cls_attr AT: 8791389037488
cls_attr AT: 8791389037424
-----------------------------------------
"""

通过上面的实际测试,测试环境是python3.7,win64。通过实际运行测试最终结果验证了前面说的结论,可以按Linux的写时复制来理解。

类的方法和对象的方法和静态方法

定义

class B(object):
#类方法
@classmethod
def fun1(cls):
print("cls method")
#静态方法
@staticmethod
def fun2():
print('staticmethod')
#对象方法
def fun3(self,y):
self.x+=y

  实例方法(对象方法)隐含的参数为类实例self,而类方法隐含的参数为类本身cls。 静态方法无隐含参数,使用装饰器将方法定义为静态方法主要为了类实例也可以直接调用此方法。所以逻辑上,类方法被类调用也可以被类实例调用,实例方法被实例调用,静态方法两者都能调用。主要区别在于参数传递上的区别,实例方法悄悄传递的是self引用作为参数,而类方法悄悄传递的是cls引用作为参数。实例方法(普通方法)应该由实例调用类不能调用;类方法可以由类调用,而且因为传入了参数cls,故也可以由实例来调用;静态方法两者都能调用。

python类属性和对象属性、类的普通方法和静态方法的更多相关文章

  1. python编程思想及对象与类

    目录 编程思想 面向对象 面向过程 对象与类的概念 对象与类的创建 对象的实例化方法-独有数据 编程思想 1.面向对象 1.1. 面向对象前戏 案例:人狗大战 # 需求:人狗大战# 1.'创造'出人和 ...

  2. python-类属性和对象属性(转)

    class People(object): # 类属性是指定义在类的内部而且在方法的外部的属性 money = 10000 def __init__(self,name,age,gender=1): ...

  3. scala 学习笔记(04) OOP(上)主从构造器/私有属性/伴生对象(单例静态类)/apply方法/嵌套类

    一.主从构造器 java中构造函数没有主.从之分,只有构造器重载,但在scala中,每个类都有一个主构造器,在定义class时,如果啥也没写,默认有一个xxx()的主构造器 class Person ...

  4. python遍历并获取对象属性--dir(),__dict__,getattr,setattr

    一.遍历对象的属性: 1.dir(obj) :返回对象的所以属性名称字符串列表(包括属性和方法). for attr in dir(obj): print(attr) 2.obj.__dict__:返 ...

  5. 从0开始的Python学习012数据结构&对象与类

    简介 数据结构是处理数据的结构,或者说,他们是用来存储一组相关数据的. 在Python中三种内建的数据结构--列表.元组和字典.学会了使用它们会使编程变得的简单. 列表 list是处理一组有序的数据结 ...

  6. JavaScript之面向对象的概念,对象属性和对象属性的特性简介

    一.大家都知道,面向对象语言有一个标志,那就是他们都有类的概念,通过类我们可以创建任意多个具有相同属性和方法的对象.但ECMAScript(指定JavaScript标准的机构,也就是说JavaScri ...

  7. Python-类属性与对象属性之间的关系

    只要对象的属性未被指定赋值过, 不论类的属性怎么改变, 对象的属性都会跟随改变, 若对象属性被赋值过, 则不跟随类的属性而改变

  8. day21——面向对象初识、结构、从类名研究类、从对象研究类、logging模块进阶版

    day21 面向对象的初识 面向对象第一个优点: 对相似功能的函数,同一个业务下的函数进行归类,分类. 想要学习面向对象必须站在一个上帝的角度去分析考虑问题. 类: 具有相同属性和功能的一类事物. 对 ...

  9. day17-Python运维开发基础(类的封装 / 对象和类的相关操作、构造方法)

    1. 类的封装及相关操作 # ### oop 面向对象程序开发 """ #用几大特征表达一类事物称为一个类,类更像是一张图纸,表达的是一个抽象概念 "" ...

随机推荐

  1. Git安装/VScode+Git+Github

    Git安装/VScode+Git+Github 1. 相关简介 git 版本控制工具,支持该工具的网站有Github.BitBucket.Gitorious.国内的OS China仓库.Csdn仓库等 ...

  2. pymysql模块使用介绍

    pymysql ​ 我们要学的pymysql就是用来在python程序中如何操作mysql,本质上就是一个套接字客户端,只不过这个套接字客户端是在python程序中用的,既然是客户端套接字,应该怎么用 ...

  3. 使用fdopen对python进程产生的文件进行权限最小化配置

    需求背景 用python进行文件的创建和读写操作时,我们很少关注所创建的文件的权限配置.对于一些安全性较高的系统,如果我们创建的文件权限其他用户或者同一用户组里的其他用户有可读权限的话,有可能导致不必 ...

  4. vue3.0 composition API

    一.Setup函数 1.创建时间:组件创建之前被调用,优先与created被调用,this指向的实例为window,created所指向的实例为proxy 2.this指向:不会指向组件实例 3.参数 ...

  5. 【Windows】Win10家庭版启用组策略gpedit.msc

    [前言] 大家都认为,Windows 10家庭版中并不包含组策略,其实不然,它是有相关文件的,只是不让你使用而已.那么我们让系统允许你使用就好了. [操作步骤] 1.首先你需要在桌面上新建一个txt文 ...

  6. SpringMVC听课笔记(七:Restful CRUD)

    这章貌似没有什么可讲的,可以看GitHub工程代码: https://github.com/heyboom/SpringMVC_Rest_CRUD

  7. log4cplus安装测试

     先介绍一下它的基本要素. Layouts :布局器,控制输出消息的格式. Appenders :挂接器,与布局器紧密配合,将特定格式的消息输出到所挂接的设备终端 (如屏幕,文件等等). Logge ...

  8. Codeforces Round #658 (Div. 2)【ABC2】

    做完前四题还有一个半小时... 比赛链接:https://codeforces.com/contest/1382 A. Common Subsequence 题意 给出两个数组,找出二者最短的公共子序 ...

  9. python的@是什么(函数装饰器)

    可以看菜鸟教程:https://www.runoob.com/w3cnote/python-func-decorators.html 还有一个实例:https://zhuanlan.zhihu.com ...

  10. hdu4770 Lights Against Dudely

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...