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 面向对象程序开发 """ #用几大特征表达一类事物称为一个类,类更像是一张图纸,表达的是一个抽象概念 "" ...
随机推荐
- HTML5与CSS3知识点总结
好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star 原文链接:https://blog.csdn.net/we ...
- Jmeter的Cookie管理器调试与参数化
默认系统都是需要登录,才能操作其它接口,所以需要添加一个HTTP Cookie 管理器,默认Cookie管理器是关闭的,需要修改jmeter配置文件jmeter.properties,该文件在jme ...
- What is the difference between btree and rtree indexing?
https://softwareengineering.stackexchange.com/questions/113256/what-is-the-difference-between-btree- ...
- 单机模拟配置Eureka集群
首先先提醒单机部署的重要点 如果使用一个ip地址(适用于单网卡)每个eureka实例使用不同的域名映射到同一个IP 如果每个eureka实例使用不同的IP(多网卡),要确保这些IP要都表示本地 本文假 ...
- 三:Spring Security 登录添加验证码
Spring Security 登录添加验证码 1.准备验证码 2.自定义过滤器 3.配置 1.准备验证码 要有验证码,首先得先准备好验证码,本文采用 Java 自画的验证码,代码如下: /** * ...
- Django(简介)
Django django对大家来说肯定不陌生啦,下面就简单的介绍一下,基础的使用以及django的特点吧 Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多 ...
- sqlite安装与封装后编译
========================安装sqlite=================官网下载安装包*.tar.gz格式./configure --prefix=/usr/server/s ...
- python ---线程,进程,协程
本章内容 线程 进程 协程 线程是最小的调度单位 进程是最小的管理单元 线程 多线程的特点: 线程的并发是利用cpu上下文切换 多线程的执行的顺序是无序的 多线程共享全局变量 线程是继承在进程里的,没 ...
- MySQL 中的自增主键
MySQL 的主键可以是自增的,那么如果在断电重启后新增的值还会延续断电前的自增值吗?自增值默认为1,那么可不可以改变呢?下面就说一下 MySQL 的自增值. 特点 保存策略 1.如果存储引擎是 My ...
- c++nullptr(空指针常量)、constexpr(常量表达式)
总述 又来更新了,今天带来的是nullptr空指针常量.constexpr(常量表达式)C++的两个用法.Result result_fun = nullptr;constexpr stati ...