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 ...
随机推荐
- 正则-input控制输入
大于0的数字:/^(?!0+(?:\.0+)?$)(?:[1-9]\d*|0)(?:\.\d{1,2})?$/ 这正则看不太懂,先放着 作者:Kevin Yang 使用正则表达式找出不包含特定字符串 ...
- Git学习之msysGit环境支持
============================== msysGit中Shell环境的中文支持 ============================== 1 中文录入的问题 默认的Shel ...
- 【SpringCloud微服务实战学习系列】配置详解
前言 Spring Boot针对常用的开发场景提供了一系列自动化配置来减少原本复杂而又几乎很少改动的模板化配置内容. 一.配置文件 Spring Boot的默认配置文件位置为src/main.reso ...
- 【大数据系列】windows搭建hadoop开发环境
一.安装JDK配置环境变量 已经安装略过 二.安装eclipse 已经安装略过 三.安装Ant 1.下载http://ant.apache.org/bindownload.cgi 2.解压 3.配置A ...
- goldengate 过滤对某张表的复制操作
在复制进程中配置下面的参数可以实现对一个用户下的某些表进行过滤,在复制的时候 不做任何操作. MAPEXCLUDE: Valid for Replicat Use the MAPEXCLUDE par ...
- select默认下拉箭头改变、option样式清除
谷歌.火狐.ie下 select 的默认下拉箭头图标差别还是比较大,一般我们都会清除默认样式,重新设计箭头图标: /* --ie清除--*/ select::-ms-expand{ display: ...
- Build step 'Execute Windows batch command' marked build as failure
坑爹的Jenkis,在执行windows命令编译.NET项目的时候命令执行成功了,但是却还是报了这样一个错: Build step 'Execute Windows batch command' ma ...
- kettle中使用JavaScript的一个例子
最近在使用kettle的时候遇到一个问题,需要对输入的一个字段进行格式化,逻辑比较复杂(需要做替换掉指定的字符串,然后将数字部分不足四位的数前边补0等操作),kettle中没有提供直接的插件来支持复杂 ...
- 【CF908E】New Year and Entity Enumeration 位运算+DP
[CF908E]New Year and Entity Enumeration 题意:给定$M=2^m-1$,我们称一个集合S是好的,当且仅当它满足:1.$\forall a\in S,a\ \ma ...
- 【转】单片机中volatile定义的作用详解
传送门:http://www.eeworld.com.cn/mcu/2011/0411/article_3928.html 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译 ...