类属性和对象属性的定义

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. SpringBoot 自动配置:Spring Data JPA

    前言 不知道从啥时候开始项目上就一直用MyBatis,其实我个人更新JPA些,因为JPA看起来OO的思想更强烈些,所以这才最近把JPA拿出来再看一看,使用起来也很简单,除了定义Entity实体外,声明 ...

  2. QUIC协议分析-基于quic-go

    quic协议分析 QUIC是由谷歌设计的一种基于UDP的传输层网络协议,并且已经成为IETF草案.HTTP/3就是基于QUIC协议的.QUIC只是一个协议,可以通过多种方法来实现,目前常见的实现有Go ...

  3. Linux监控内核SNMP计数器

    nstat命令和rtacct命令是一个简单的监视内核的SNMP计数器和网络接口状态的实用工具. 语法 nstat/rtacct (选项) 选项 -h:显示帮助信息: -V:显示指令版本信息: -z:显 ...

  4. GIS基本概念,空间分析

    GIS基本概念,空间分析 一.GIS基本概念 1.1 要素模型(Feature) 1.2 矢量数据 1.3 空间分析 1.3.1 空间查询和空间量算 1.3.2 缓冲区分析 1.3.3 叠加分析 1. ...

  5. 设计模式c++(1)

    本来是想把之前的<head first设计模式>看了,不过因为这本书是java实现的,跟c++还是略有区别. 于是找了一下,发现了一个不错的blog,打算连书带blog一起参考着看了. b ...

  6. RabbitMQ (简单集群部署操作)

    RabbitMQ 集群部署 前期准备 第一步:三台linux系统(centos7.3) 主机名(hostname) 网卡ip node1 192.168.137.138 node2 192.168.1 ...

  7. SQL系列总结——基础篇(三)

    之前的两篇文章SQL系列总结:<基础篇一>, <基础篇二>已经介绍了一些基本的数据库知识.现在让我们来从头开始构建一个数据库.到管理数据库和对象. 架构开始!     1.创建 ...

  8. Flink-v1.12官方网站翻译-P027-State Schema Evolution

    状态方案的演变 Apache Flink流媒体应用通常被设计为无限期或长时间运行.与所有长期运行的服务一样,应用程序需要更新以适应不断变化的需求.这对于应用程序所针对的数据模式也是一样的,它们会随着应 ...

  9. Testing Round #16 (Unrated)

    比赛链接:https://codeforces.com/contest/1351 A - A+B (Trial Problem) #include <bits/stdc++.h> usin ...

  10. P3164 [CQOI2014]和谐矩阵(高斯消元 + bitset)

    题意:构造一个$n*m$矩阵 使得每个元素和上下左右的xor值=0 题解:设第一行的每个元素值为未知数 可以依次得到每一行的值 然后把最后一行由题意条件 得到$m$个方程 高斯消元解一下 bitset ...