1、什么是类对象,实例对象

类对象:类名
实例对象:类创建的对象

2、类属性就是类对象所拥有的属性,它被所有类对象实例对象所共有,在内存中只存在一个副本,这个和C++、Java中类的静态成员变量有点类似。对于公有的类属性,在类外可以通过类对象实例对象访问

类属性

  1. # 类属性
  2. class people:
  3. name="Tom"    #公有的类属性
  4. __age=18      #私有的类属性
  5. p=people()
  6. print(p.name)   #实例对象
  7. print(people.name)  #类对象
  8. # print(p.__age)    #错误 不能在类外通过实例对象访问私有的类属性
  9. print(people.__age) #错误 不能在类外同过类对象访问私有的类属性

实例属性

  1. class people:
  2. name="tom"
  3. p=people()
  4. p.age=18
  5. print(p.name)
  6. print(p.age)    #实例属性是实例对象特有的,类对象不能拥有
  7. print(people.name)
  8. #print(people.age)  #错误:实例属性,不能通过类对象调用

也可以将实例属性放在构造方法中

  1. class people:
  2. name="tom"
  3. def  __init__(self,age):
  4. self.age=age
  5. p=people(18)
  6. print(p.name)
  7. print(p.age)    #实例属性是实例对象特有的,类对象不能拥有
  8. print(people.name)
  9. # print(people.age)  #错误:实例属性,不能通过类对象调用

类属性和实例属性混合

  1. class people:
  2. name="tom"      #类属性:实例对象和类对象可以同时调用
  3. def  __init__(self,age):    #实例属性
  4. self.age=age
  5. p=people(18)    #实例对象
  6. p.sex="男"       #实例属性
  7. print(p.name)
  8. print(p.age)    #实例属性是实例对象特有的,类对象不能拥有
  9. print(p.sex)
  10. print(people.name)  #类对象
  11. # print(people.age)  #错误:实例属性,不能通过类对象调用
  12. # print(people.sex)  #错误:实例属性,不能通过类对象调用

# 如果在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,
# 会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且如果通过
# 实例对象引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性

  1. class Animal:
  2. name="Panda"
  3. print(Animal.name)  #类对象引用类属性
  4. p=Animal()
  5. print(p.name)       #实例对象引用类属性时,会产生一个同名的实例属性
  6. p.name="dog"        #修改的只是实例属性的,不会影响到类属性
  7. print(p.name)         #dog
  8. print(Animal.name)    #panda
  9. # 删除实例属性
  10. del p.name
  11. print(p.name)
  1. class Test:
  2. num=100 #类属性
  3. def __init__(self):
  4. self.age=18     #实例属性
  5. test1=Test()
  6. test2=Test()
  7. # test1.age=19
  8. # test2.age=20
  9. print(test1.num)    #100
  10. test1.num=200       #如果通过对象去修改类属性,那么Python会自动给这个对象和这个类属性相同名字的实例属性
  11. print(test1.num)    #200,只是修改了副本
  12. print(Test.num)     #100
  13. del test1.num        #删除之后,仍能打印
  14. print(test1.num)

3、类方法

是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以'cls'作为第一个参数的名字,就最好用'cls'了),能够通过实例对象和类对象去访问。

  1. class people:
  2. country="china"
  3. @classmethod
  4. def getCountry(cls):
  5. return cls.country
  6. p=people()
  7. print(p.getCountry())   #实例对象调用类方法
  8. print(people.getCountry())  #类对象调用类方法

类方法还有一个用途就是可以对类属性进行修改:

  1. class people:
  2. country="china"
  3. @classmethod
  4. def getCountry(cls):
  5. return cls.country
  6. @classmethod
  7. def setCountry(cls,country):
  8. cls.country=country
  9. p=people()
  10. print(p.getCountry())   #实例对象调用类方法
  11. print(people.getCountry())  #类对象调用类方法
  12. p.setCountry("Japan")
  13. print(p.getCountry())
  14. print(people.getCountry())

4、静态方法

需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数

  1. class people3:
  2. country="china"
  3. @staticmethod
  4. def getCountry():
  5. return people3.country
  6. p=people3()
  7. print(p.getCountry())   #实例对象调用类方法
  8. print(people3.getCountry())  #类对象调用类方法

从类方法和实例方法以及静态方法的定义形式就可以看出来,类方法的第一个参数是类对象cls,那么通过cls引用的必定是类对象的属性和方法;而实例方法的第一个参数是实例对象self,那么通过self引用的可能是类属性、也有可能是实例属性(这个需要具体分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性优先级更高。

静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过类对象来引用

Python中的类属性、实例属性与类方法、静态方法的更多相关文章

  1. 全面了解python中的类,对象,方法,属性

    全面了解python中的类,对象,方法,属性 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...

  2. python中的类和实例

    今天花了两个多小时后搜索相关博客看了看python中有关类和实例的介绍,差不多大概明白了. python中的类和c++中的类是一样的,不同之处就是c++的类,如果含有成员变量,并且成员变量发生变化后, ...

  3. 第8.20节 Python中限制动态定义实例属性的白名单:__slots__

    一. 引言 按照<第7.10节 Python类中的实例变量定义与使用>.<第7.14节Python类中的实例方法解析>中的介绍,当定义了一个类,并且创建了该类的实例后,可以给该 ...

  4. Python面试题之Python中的类和实例

    0x00 前言 类,在学习面向对象我们可以把类当成一种规范,这个思想就我个人的体会,感觉很重要,除了封装的功能外,类作为一种规范,我们自己可以定制的规范,从这个角度来看,在以后我们学习设计模式的时候, ...

  5. Python类的实例属性详解

    实例属性 1.类被实例化后才会具有的属性 2.一般在_init_()方法中创建并初始化 3.直接使用即定义:self.<属性名> 4.引用方法:self.<属性名> 5.sel ...

  6. python中的类,对象,方法,属性等介绍

    注:这篇文章写得很好.加底纹的是我自己的理解 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...

  7. Python中类的声明,使用,属性,实例属性,计算属性及继承,重写

    Python中的类的定义以及使用: 类的定义: 定义类 在Python中,类的定义使用class关键字来实现 语法如下: class className: "类的注释" 类的实体 ...

  8. Java生鲜电商平台-生鲜电商中商品类目、属性、品牌、单位架构设计与实战

    Java生鲜电商平台-生鲜电商中商品类目.属性.品牌.单位架构设计与实战 说明:Java生鲜电商平台-生鲜电商中商品类目.属性.品牌.单位架构设计与实战经验分享 凡是涉及到购物,必然是建立在商品的基础 ...

  9. Python进阶_类与实例

    上一节将到面对对象必须先抽象模型,之后直接利用模型.这一节我们来具体理解一下这句话的意思. 面对对象最重要的概念就是类(class)和实例(instance),必须牢记类是抽象的模板,比如studen ...

随机推荐

  1. 【转载】经典.net面试题目【为了笔试。。。。。】

    . 简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有成员, 在类的内部才可以访问. protected : 保护成员 ...

  2. Why is IMAP better than POP?

    https://www.fastmail.com/help/technical/imapvspop.html POP is a very simple protocol that only allow ...

  3. [转]stetho使用介绍

    原文链接:http://www.jianshu.com/p/c03a8959d1a5# 转载请注明来源,尊重作者成果 介绍 stetho是facebook开发的Android调试工具.它可以通过chr ...

  4. C语言位操作初步

    位操作允许程序员对单独的位进行操作,例如,早某些机器上,短整型占16位,位操作将每一位单独操作. 位操作允许程序员设置.清除.测试与其他的操作,这些操作如下表: 操作 含义 & 按位与 | 按 ...

  5. Altium Designer 输出 gerber 光绘文件的详细说明

    Altium Designer 输出 gerber 光绘文件的详细说明 PCB画好后,我们需要输出光绘文件交给制版厂家.由此,输出光绘文件的重要性就显出来了. 先复习一下介绍各层的定义吧,哈哈 (1) ...

  6. 交换机多VLAN访问同一网络

    一.前言 经常有需求通过交换机改变IP地址或者实现在同一个交换机中建立多个VLAN访问外部网络(VLAN之间独立),在折腾了多次后,稍有心得,现记录之. 二.实现方案 何为VLAN就不在此赘述.实现起 ...

  7. Razon模板

    转:http://www.cnblogs.com/huangxincheng/p/3644313.html 随笔- 119 文章- 0 评论- 2039 抛弃NVelocity,来玩玩Razor   ...

  8. zookeeper学习资料汇总

    zookeeper入门介绍   (1) zookeeper入门介绍     (2) zookeeper应用场景介绍 (淘宝团队)   (3) 分布式服务框架 Zookeeper -- 管理分布式环境中 ...

  9. 关于python的【if __name__ == "__main__":】

    学习东西真的需要自己动手,然后遇到问题,自己学着去解决.当然如果能得到高人指点,那真是走了八辈子运了.可以节省很多时间.但是大多数情况下,不能总是有高人来指点我们.这时就需要靠我们自己了. 在学习py ...

  10. Windows运行python脚本文件

    开始学习python就是听说这个语言写脚本文件特别方便,简单使用.学了一段时间,但是直到现在我才直到直到怎么在Windows的cmd上运行脚本文件. 之前一直都是在pycharm上运行,并不实用. 百 ...