Python中的类属性、实例属性与类方法、静态方法
1、什么是类对象,实例对象
类对象:类名
实例对象:类创建的对象
2、类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,这个和C++、Java中类的静态成员变量有点类似。对于公有的类属性,在类外可以通过类对象和实例对象访问
类属性
- # 类属性
 - class people:
 - name="Tom" #公有的类属性
 - __age=18 #私有的类属性
 - p=people()
 - print(p.name) #实例对象
 - print(people.name) #类对象
 - # print(p.__age) #错误 不能在类外通过实例对象访问私有的类属性
 - print(people.__age) #错误 不能在类外同过类对象访问私有的类属性
 
实例属性
- class people:
 - name="tom"
 - p=people()
 - p.age=18
 - print(p.name)
 - print(p.age) #实例属性是实例对象特有的,类对象不能拥有
 - print(people.name)
 - #print(people.age) #错误:实例属性,不能通过类对象调用
 
也可以将实例属性放在构造方法中
- class people:
 - name="tom"
 - def __init__(self,age):
 - self.age=age
 - p=people(18)
 - print(p.name)
 - print(p.age) #实例属性是实例对象特有的,类对象不能拥有
 - print(people.name)
 - # print(people.age) #错误:实例属性,不能通过类对象调用
 
类属性和实例属性混合
- class people:
 - name="tom" #类属性:实例对象和类对象可以同时调用
 - def __init__(self,age): #实例属性
 - self.age=age
 - p=people(18) #实例对象
 - p.sex="男" #实例属性
 - print(p.name)
 - print(p.age) #实例属性是实例对象特有的,类对象不能拥有
 - print(p.sex)
 - print(people.name) #类对象
 - # print(people.age) #错误:实例属性,不能通过类对象调用
 - # print(people.sex) #错误:实例属性,不能通过类对象调用
 
# 如果在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,
# 会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且如果通过
# 实例对象引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性
- class Animal:
 - name="Panda"
 - print(Animal.name) #类对象引用类属性
 - p=Animal()
 - print(p.name) #实例对象引用类属性时,会产生一个同名的实例属性
 - p.name="dog" #修改的只是实例属性的,不会影响到类属性
 - print(p.name) #dog
 - print(Animal.name) #panda
 - # 删除实例属性
 - del p.name
 - print(p.name)
 
- class Test:
 - num=100 #类属性
 - def __init__(self):
 - self.age=18 #实例属性
 - test1=Test()
 - test2=Test()
 - # test1.age=19
 - # test2.age=20
 - print(test1.num) #100
 - test1.num=200 #如果通过对象去修改类属性,那么Python会自动给这个对象和这个类属性相同名字的实例属性
 - print(test1.num) #200,只是修改了副本
 - print(Test.num) #100
 - del test1.num #删除之后,仍能打印
 - print(test1.num)
 
3、类方法
是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以'cls'作为第一个参数的名字,就最好用'cls'了),能够通过实例对象和类对象去访问。
- class people:
 - country="china"
 - @classmethod
 - def getCountry(cls):
 - return cls.country
 - p=people()
 - print(p.getCountry()) #实例对象调用类方法
 - print(people.getCountry()) #类对象调用类方法
 
类方法还有一个用途就是可以对类属性进行修改:
- class people:
 - country="china"
 - @classmethod
 - def getCountry(cls):
 - return cls.country
 - @classmethod
 - def setCountry(cls,country):
 - cls.country=country
 - p=people()
 - print(p.getCountry()) #实例对象调用类方法
 - print(people.getCountry()) #类对象调用类方法
 - p.setCountry("Japan")
 - print(p.getCountry())
 - print(people.getCountry())
 
4、静态方法
需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数
- class people3:
 - country="china"
 - @staticmethod
 - def getCountry():
 - return people3.country
 - p=people3()
 - print(p.getCountry()) #实例对象调用类方法
 - print(people3.getCountry()) #类对象调用类方法
 
从类方法和实例方法以及静态方法的定义形式就可以看出来,类方法的第一个参数是类对象cls,那么通过cls引用的必定是类对象的属性和方法;而实例方法的第一个参数是实例对象self,那么通过self引用的可能是类属性、也有可能是实例属性(这个需要具体分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性优先级更高。
静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过类对象来引用
Python中的类属性、实例属性与类方法、静态方法的更多相关文章
- 全面了解python中的类,对象,方法,属性
		
全面了解python中的类,对象,方法,属性 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...
 - python中的类和实例
		
今天花了两个多小时后搜索相关博客看了看python中有关类和实例的介绍,差不多大概明白了. python中的类和c++中的类是一样的,不同之处就是c++的类,如果含有成员变量,并且成员变量发生变化后, ...
 - 第8.20节 Python中限制动态定义实例属性的白名单:__slots__
		
一. 引言 按照<第7.10节 Python类中的实例变量定义与使用>.<第7.14节Python类中的实例方法解析>中的介绍,当定义了一个类,并且创建了该类的实例后,可以给该 ...
 - Python面试题之Python中的类和实例
		
0x00 前言 类,在学习面向对象我们可以把类当成一种规范,这个思想就我个人的体会,感觉很重要,除了封装的功能外,类作为一种规范,我们自己可以定制的规范,从这个角度来看,在以后我们学习设计模式的时候, ...
 - Python类的实例属性详解
		
实例属性 1.类被实例化后才会具有的属性 2.一般在_init_()方法中创建并初始化 3.直接使用即定义:self.<属性名> 4.引用方法:self.<属性名> 5.sel ...
 - python中的类,对象,方法,属性等介绍
		
注:这篇文章写得很好.加底纹的是我自己的理解 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...
 - Python中类的声明,使用,属性,实例属性,计算属性及继承,重写
		
Python中的类的定义以及使用: 类的定义: 定义类 在Python中,类的定义使用class关键字来实现 语法如下: class className: "类的注释" 类的实体 ...
 - Java生鲜电商平台-生鲜电商中商品类目、属性、品牌、单位架构设计与实战
		
Java生鲜电商平台-生鲜电商中商品类目.属性.品牌.单位架构设计与实战 说明:Java生鲜电商平台-生鲜电商中商品类目.属性.品牌.单位架构设计与实战经验分享 凡是涉及到购物,必然是建立在商品的基础 ...
 - Python进阶_类与实例
		
上一节将到面对对象必须先抽象模型,之后直接利用模型.这一节我们来具体理解一下这句话的意思. 面对对象最重要的概念就是类(class)和实例(instance),必须牢记类是抽象的模板,比如studen ...
 
随机推荐
- android studio 引用远程仓库下载慢(JCenter下载慢)的办法
			
https://blog.csdn.net/linglingchenchen/article/details/62236723 解决android studio引用远程仓库下载慢(JCenter下载慢 ...
 - mysql 管理脚本
			
1.环境文件 -bash-4.1$ more mysql_env.ini #!/bin/sh #set env MYSQL_USER=root MYSQL_PASS=123456' #check pa ...
 - 4327: JSOI2012 玄武密码[SAM]
			
4327: JSOI2012 玄武密码 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 263 Solved: 112[Submit][Status] ...
 - 添加Net4CollectionTypeFactory的原因
			
.NET4.0已经实现了该功能 http://jahav.com/blog/nhibernate-using-net-4-iset/ NHibernate using .NET 4 ISet 0 Co ...
 - Spark2 文件处理和jar包执行
			
上传数据文件 mkdir -p data/ml/ hadoop fs -mkdir -p /datafile/wangxiao/ hadoop fs -ls / hadoop fs -put /hom ...
 - Spring Boot 利用插件构造QueryDSL语句时报错:You need to run build with JDK or have tools.jar on the classpath.If this occur....
			
You need to run build with JDK or have tools.jar on the classpath.If this occures during eclipse bui ...
 - 9.21 form 和Ajax详解
			
form 表单 参考连接 : http://www.cnblogs.com/liwenzhou/p/8747872.html
 - matlab中norm函数的用法
			
格式:n=norm(A,p) 功能:norm函数可计算几种不同类型的矩阵范数,根据p的不同可得到不同的范数 以下是Matlab中help norm 的解释 NORM Matrix or vecto ...
 - XTU 1261 - Roads - [最小割][2017湘潭邀请赛B题(江苏省赛)]
			
之前在网上搜了一个下午没搜到这道题的题解,然后同时又对着叉姐写的两行字题解看了一个下午: 虽然基本上已经知道了这题的思路,但愣是因为自己代码实现起来太繁复,外加不确定正确性,没敢码…… 但是一道题肝了 ...
 - h5地理位置API
			
h5地理位置API 地理API允许javascript程序向浏览器询问用户的真实地理位置,支持地理位置API的浏览器在访问前总是会询问用户是否允许. 获取用户地理的途径有: 1.ip地 ...