python类属性和对象属性、类的普通方法和静态方法
类属性和对象属性的定义
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类属性和对象属性、类的普通方法和静态方法的更多相关文章
- python编程思想及对象与类
目录 编程思想 面向对象 面向过程 对象与类的概念 对象与类的创建 对象的实例化方法-独有数据 编程思想 1.面向对象 1.1. 面向对象前戏 案例:人狗大战 # 需求:人狗大战# 1.'创造'出人和 ...
- python-类属性和对象属性(转)
class People(object): # 类属性是指定义在类的内部而且在方法的外部的属性 money = 10000 def __init__(self,name,age,gender=1): ...
- scala 学习笔记(04) OOP(上)主从构造器/私有属性/伴生对象(单例静态类)/apply方法/嵌套类
一.主从构造器 java中构造函数没有主.从之分,只有构造器重载,但在scala中,每个类都有一个主构造器,在定义class时,如果啥也没写,默认有一个xxx()的主构造器 class Person ...
- python遍历并获取对象属性--dir(),__dict__,getattr,setattr
一.遍历对象的属性: 1.dir(obj) :返回对象的所以属性名称字符串列表(包括属性和方法). for attr in dir(obj): print(attr) 2.obj.__dict__:返 ...
- 从0开始的Python学习012数据结构&对象与类
简介 数据结构是处理数据的结构,或者说,他们是用来存储一组相关数据的. 在Python中三种内建的数据结构--列表.元组和字典.学会了使用它们会使编程变得的简单. 列表 list是处理一组有序的数据结 ...
- JavaScript之面向对象的概念,对象属性和对象属性的特性简介
一.大家都知道,面向对象语言有一个标志,那就是他们都有类的概念,通过类我们可以创建任意多个具有相同属性和方法的对象.但ECMAScript(指定JavaScript标准的机构,也就是说JavaScri ...
- Python-类属性与对象属性之间的关系
只要对象的属性未被指定赋值过, 不论类的属性怎么改变, 对象的属性都会跟随改变, 若对象属性被赋值过, 则不跟随类的属性而改变
- day21——面向对象初识、结构、从类名研究类、从对象研究类、logging模块进阶版
day21 面向对象的初识 面向对象第一个优点: 对相似功能的函数,同一个业务下的函数进行归类,分类. 想要学习面向对象必须站在一个上帝的角度去分析考虑问题. 类: 具有相同属性和功能的一类事物. 对 ...
- day17-Python运维开发基础(类的封装 / 对象和类的相关操作、构造方法)
1. 类的封装及相关操作 # ### oop 面向对象程序开发 """ #用几大特征表达一类事物称为一个类,类更像是一张图纸,表达的是一个抽象概念 "" ...
随机推荐
- mysqldumpslow基本使用
参数解释 -s, 是表示按照何种方式排序 c: 访问计数 l: 锁定时间 r: 返回记录 t: 查询时间 al:平均锁定时间 ar:平均返回记录数 at:平均查询时间 -t, 是top n的意思,即为 ...
- django form和form组件
form介绍: 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是 ...
- 面试必问:如何实现Redis分布式锁
摘要:今天我们来聊聊分布式锁这块知识,具体的来看看Redis分布式锁的实现原理. 一.写在前面 现在面试,一般都会聊聊分布式系统这块的东西.通常面试官都会从服务框架(Spring Cloud.Dubb ...
- Service Mesh架构的持续演进 单体模块化 SOA 微服务 Service Mesh
架构不止-严选Service Mesh架构的持续演进 网易严选 王育松 严选技术团队 2019-11-25 前言同严选的业务一样,在下层承载它的IT系统架构一样要生存.呼吸.增长和发展,否则过时的.僵 ...
- Transformation-Based Error-Driven Learning and Natural Language Processing: A Case Study in Part-of-Speech Tagging
http://delivery.acm.org/10.1145/220000/218367/p543-brill.pdf?ip=116.30.5.154&id=218367&acc=O ...
- C++ Primer Plus读书笔记(五)循环和关系表达式
1.前缀运算符的优先级是从右到左,例如: 1 *++p; //这句话的含义是先对p进行++,再取* 2.循环 c++11新增了一种循环方式,有点和python类似,如下: 1 array<int ...
- MySQL时间格式转换函数
MySQL DATE_FORMAT() 函数注:当前年份是2018-7-19 SELECT DATE_FORMAT(NOW(),'%Y') ...
- 【ElasticSearch】 使用AWS云ES服务来分析程序日志
最近公司系统升级,有些API的调用接口达到了每天10几万的请求量.目前公司里的日志,都是写文本文件中的.为了能够更好的分析这些日志数据,公司采用了AWS 的 ElasticSearch服务来分析日志. ...
- JavaWeb——过滤器及监听器
什么是过滤器? 过滤器示意图 Filter是如何实现拦截的? Filter的生命周期 Filter的创建 Filter的销毁 FilterConfig接口 Servlet过滤器有关接口 过滤器配置 F ...
- mysql 用户 登陆 权限相关
1. CREATE USER 'dog2'@'localhost' IDENTIFIED BY ''; 将"localhost"改为"%",表示在任何一台电脑上 ...