类属性和对象属性的定义

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. Python Debug工具

    最近在github上冒出了一个python的debug神器PySnooper,号称在debug时可以消灭print.那么该工具有哪些优点呢,如何使用该工具呢.本文就介绍该工具的优缺点和使用方式. 前言 ...

  2. CACTI优化-流量接口统计total输入和输出流量数据

    看图,没有优化前(没有显示流入和流出的总流量是多少): 优化后(有显示流入和流出总流量统计): 如何实现呢?本节就是处理的过程小结.第一步:登陆cacti管理平台进入控制台->模板->图形 ...

  3. JAVA中关于基本数据和引用数据参数传递过程

    基本数据和引用数据参数传递过程 案例1:判断程序的输出结果 class Demo{ public static void main(String[] atgs){ int x =4; show(x); ...

  4. Microsoft Windows的消息循环

    https://zh.wikipedia.org/wiki/Microsoft_Windows的訊息迴圈 微软视窗操作系统是以事件驱动做为程序设计的基础.程序的线程会从操作系统获取消息.应用程序会不断 ...

  5. 类型检查 Type Checking 一些编程语言并不安全 类型化语言的优点 定型环境 (符号表) 断言的种类

    Compiler http://staff.ustc.edu.cn/~bjhua/courses/compiler/2014/ http://staff.ustc.edu.cn/~bjhua/cour ...

  6. QT串口助手(四):数据发送

    作者:zzssdd2 E-mail:zzssdd2@foxmail.com 一.前言 开发环境:Qt5.12.10 + MinGW 实现的功能 串口数据的发送 ascii字符与hex字符的相互转换 自 ...

  7. Golang之垃圾回收

    本篇主要是参考了: http://legendtkl.com/2017/04/28/golang-gc/ 说是参考,但其实基本上是原封不动. GC算法简介: 1. 引用计数 引用计数的思想非常简单:每 ...

  8. jquery each报 Uncaught TypeError: Cannot use 'in' operator to search for错误

    用$.each()来遍历后台传过来的json数据.直接遍历传过来的数据时就发生 Uncaught TypeError: Cannot use 'in' operator to search for 这 ...

  9. Java反射开窍--1

    1.通过案例引出反射并体会反射的好处 案例:美团外卖 --->付款 --->要么用微信支付 要么用支付宝支付 package com.zhaoss.test01; //接口的制定方:美团外 ...

  10. 模块化之CommonJS

    一.CommonJS特点 ​ 经过前面讨论,已经知道无模块化时项目中存在的问题.CommonJS的特点就是解决这些问题即: ​ 1.每个文件都是一个单独的模块,有自己的作用域,声明的变量不是全局变量( ...