一、类的成员

类的成员可以分为三大类:字段、方法和属性

注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段。而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份。

1. 字段

字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同,

  • 普通字段属于对象
  • 静态字段属于

class Province:# 静态字段country = '中国'def __init__(self, name):# 普通字段self.name = name# 直接访问普通字段
obj = Province('河北省')
print obj.name# 直接访问静态字段
Province.country

字段的定义和使用

由上述代码可以看出【普通字段需要通过对象来访问】【静态字段通过类访问】,在使用上可以看出普通字段和静态字段的归属是不同的。其在内容的存储方式类似如下图:

由上图可是:

  • 静态字段在内存中只保存一份
  • 普通字段在每个对象中都要保存一份

应用场景: 通过类创建对象时,如果每个对象都具有相同的字段,那么就使用静态字段

2. 方法

方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。

  • 普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self
  • 类方法:由调用; 至少一个cls参数;执行类方法时,自动将调用该方法的复制给cls
  • 静态方法:由调用;无默认参数;

class Foo:def __init__(self, name):self.name = namedef ord_func(self):""" 定义普通方法,至少有一个self参数 """# print self.nameprint '普通方法'@classmethoddef class_func(cls):""" 定义类方法,至少有一个cls参数 """print '类方法'@staticmethoddef static_func():""" 定义静态方法 ,无默认参数"""print '静态方法'# 调用普通方法
f = Foo()
f.ord_func()# 调用类方法
Foo.class_func()# 调用静态方法
Foo.static_func()

方法的定义和使用

相同点:对于所有的方法而言,均属于类(非对象)中,所以,在内存中也只保存一份。

不同点:方法调用者不同、调用方法时自动传入的参数不同。

3.属性

如果你已经了解Python类中的方法,那么属性就非常简单了,因为Python中的属性其实是普通方法的变种。

对于属性,有以下两个知识点:

  • 属性的基本使用
  • 属性的两种定义方式

1、属性的基本使用

# ############### 定义 ###############
class Foo:def func(self):pass# 定义属性@propertydef prop(self):pass
# ############### 调用 ###############
foo_obj = Foo()foo_obj.func()
foo_obj.prop   #调用属性

由属性的定义和调用要注意一下几点:

  • 定义时,在普通方法的基础上添加 @property 装饰器;
  • 定义时,属性仅有一个self参数
  • 调用时,无需括号
               方法:foo_obj.func()
               属性:foo_obj.prop

注意:属性存在意义是:访问属性时可以制造出和访问字段完全相同的假象

属性由方法变种而来,如果Python中没有属性,方法完全可以代替其功能。

装饰器方式 创建属性的get set delete

# ############### 定义 ###############
class Goods(object):@propertydef price(self):print '@property'@price.setter  #定义设置属性方法(方法名称需要与property装饰器配置方法相同)def price(self, value):print '@price.setter'@price.deleter  #定义删除属性方法(方法名称需要与property装饰器配置方法相同)def price(self):print '@price.deleter'# ############### 调用 ###############
obj = Goods()obj.price          # 自动执行 @property 修饰的 price 方法,并获取方法的返回值obj.price = 123    # 自动执行 @price.setter 修饰的 price 方法,并将  123 赋值给方法的参数del obj.price      # 自动执行 @price.deleter 修饰的 price 方法

property 对象 创建属性的get set delete

property的构造方法中有个四个参数

  • 第一个参数是方法名,调用 对象.属性 时自动触发执行方法
  • 第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法
  • 第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法
  • 第四个参数是字符串,调用 对象.属性.__doc__ ,此参数是该属性的描述信息

class Goods(object):def __init__(self):# 原价self.original_price = 100# 折扣self.discount = 0.8def get_price(self):# 实际价格 = 原价 * 折扣new_price = self.original_price * self.discountreturn new_pricedef set_price(self, value):self.original_price = valuedef del_price(self, value):del self.original_pricePRICE = property(get_price, set_price, del_price, '价格属性描述...')obj = Goods()
obj.PRICE         # 获取商品价格
obj.PRICE = 200   # 修改商品原价
del obj.PRICE     # 删除商品原价

实例

类成员的修饰符

  • 公有成员,在任何地方都能访问
  • 私有成员,只有在类的内部才能方法

私有成员和公有成员的定义不同:私有成员命名时,前两个字符是下划线。(特殊成员除外,例如:__init__、__call__、__dict__等)

class C:def __init__(self):self.name = '公有字段'self.__foo = "私有字段"

静态字段

  • 公有静态字段:类可以访问;类内部可以访问;派生类中可以访问
  • 私有静态字段:仅类内部可以访问;

普通字段

  • 公有普通字段:对象可以访问;类内部可以访问;派生类中可以访问
  • 私有普通字段:仅类内部可以访问;

ps:非要访问私有属性的话,可以通过 对象._类__属性名

类的特殊成员

1. __doc__

  表示类的描述信息

2. __module__ 和  __class__ 

  __module__ 表示当前操作的对象在那个模块

  __class__     表示当前操作的对象的类是什么

3. __init__

  构造方法,通过类创建对象时,自动触发执行。

4. __del__

  析构方法,当对象在内存中被释放时,自动触发执行。

5. __call__

  对象后面加括号,触发执行。

注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class Foo:def __init__(self):passdef __call__(self, *args, **kwargs):print '__call__'obj = Foo() # 执行 __init__
obj()       # 执行 __call__

  

 6. __str__

  如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。

class Foo:def __str__(self):return 'tubie'obj = Foo()
print obj
# 输出:tubie

  

7. __dict__

  类或对象中的所有成员

class Province:country = 'China'def __init__(self, name, count):self.name = nameself.count = countdef func(self, *args, **kwargs):print 'func'# 获取类的成员,即:静态字段、方法、
print Province.__dict__
# 输出:{'country': 'China', '__module__': '__main__', 'func': <function func at 0x10be30f50>, '__init__': <function __init__ at 0x10be30ed8>, '__doc__': None}obj1 = Province('HeBei',10000)
print obj1.__dict__
# 获取 对象obj1 的成员
# 输出:{'count': 10000, 'name': 'HeBei'}obj2 = Province('HeNan', 3888)
print obj2.__dict__
# 获取 对象obj1 的成员
# 输出:{'count': 3888, 'name': 'HeNan'}

8、__getitem__、__setitem__、__delitem__

用于索引操作,如字典。以上分别表示获取、设置、删除数据

#!/usr/bin/env python
# -*- coding:utf-8 -*-class Foo(object):def __getitem__(self, key):print '__getitem__',keydef __setitem__(self, key, value):print '__setitem__',key,valuedef __delitem__(self, key):print '__delitem__',keyobj = Foo()result = obj['k1']      # 自动触发执行 __getitem__
obj['k2'] = 'wupeiqi'   # 自动触发执行 __setitem__
del obj['k1']           # 自动触发执行 __delitem__

  

该三个方法用于分片操作,如:列表

#!/usr/bin/env python
# -*- coding:utf-8 -*-class Foo(object):def __getitem__(self, key):print '__getslice__',key        print(key.start)  #切片起始值        print(key.stop)   #切片终止值        print(key.step)   #切片步长def __setitem__(self, key, value):print '__setslice__',key,valuedef __delitem__(self, key):print '__delslice__',keyobj = Foo()obj[-1:1]                   # 自动触发执行 __getitem__
obj[0:1] = [11,22,33,44]    # 自动触发执行 __setitem__
del obj[0:2]                # 自动触发执行 __delitem__

  

9. __iter__ 

用于迭代器,之所以列表、字典、元组可以进行for循环,是因为类型内部定义了 __iter__

#!/usr/bin/env python
# -*- coding:utf-8 -*-class Foo(object):def __init__(self, sq):self.sq = sqdef __iter__(self):    #首先必须包含__iter__方法return iter(self.sq)  #其次返回值已定要是可迭代的值iter()迭代器obj = Foo([11,22,33,44])for i in obj:print i

  

转载于:https://www.cnblogs.com/zshaox/p/5634027.html

python 学习 [day8]class成员相关推荐

  1. python 学习 [day6]

    递归阶乘: 函数自己调用自己循环操作的模式称之为递归 def func(num):if num == 1:return 1return num * func(num - 1)print(func(7) ...

  2. PS初学者实例教程——图层样式的学习[斜面和浮雕]

    本系列教程由中国教程网互助课堂专 为PS新手制作,在这里有系列的教程.练习,并有老师对练习进行点评与指导,欢迎朋友们的光临! 本例我们学习"斜面和浮雕"图层样式 斜 面和浮雕是使用 ...

  3. [转载] Python学习:Python成员运算符和身份运算符

    参考链接: Python中==和is运算符之间的区别 Python成员运算符 除了以上的一些运算符之外,Python还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组. 运算符 描 ...

  4. 11.15-11.21【大学生Python学习】社区总结+优秀社区成员点名表扬技术书籍和CSDN定制背包奖励~

      欢迎每一位小伙伴的加入: 社区:大学生Python学习   文章目录: 11.15-11.21的社区总结: 优秀群成员点名表扬&&技术书籍和CSDN定制背包奖励: 排名第一位:[X ...

  5. python学习第十二天

    "笨办法学python"小结 对于<笨办法学Python>的学习基本上是学习完毕了,但是还需要勤加练习,个人认为要学好这个东西唯有多敲代码,多读代码,多记忆才是主要途径 ...

  6. Python学习的十个阶段,学完大成,对应一下看看你自己在哪个阶段

    大家好,我是梦雅. \ 今天给大家整理了Python学习的十个阶段内容,看看你现在正处于哪个阶段,想学习的朋友也可以根据这个阶段规划学习. \ \ \ 阶段一:Python基础[ 初入江湖] \ Li ...

  7. python学习之第四课时--运算符

    python学习之第四课时--运算符 运算符 1.算数运算 运算符 描述 实例 a=10,b=20 = 加,两个对象相加 a+b输出30 - 减,一个数减去另一个数 a-b输出-10 * 乘,两个数相 ...

  8. Python 学习之二: module, import 与 import as

    2019独角兽企业重金招聘Python工程师标准>>> http://blog.csdn.net/fanshengchong/article/details/7039692 Pyth ...

  9. Linux RCU机制详解[转]

    一:前言 RCU机制出现的比较早,只是在linux kernel中一直到2.5版本的时候才被采用.关于RCU机制,这里就不做过多的介绍了,网上有很多有关RCU介绍和使用的文档.请自行查阅.本文主要是从 ...

最新文章

  1. iOS使用自签名证书实现HTTPS请求
  2. node.js java web_Node.js 做 Web 后端优势为什么这么大?
  3. 05构建之法阅读笔记之三
  4. 一个19岁美国少年眼中的各种社交应用
  5. VTK:图片之ImageConvolve
  6. MySQL中字符串函数详细介绍
  7. leetcode - 467. 环绕字符串中唯一的子字符串
  8. Google hacker的***方法
  9. 串结构练习--字符串匹配
  10. pytorch: 将一序列操作串联
  11. LINUX用C建立多级目录(测试通过)
  12. Python中的输入输出(IO)
  13. Android中向ContactsProvider中插入大量联系人
  14. 【论文翻译 arXiv 2020】异质网表示学习综述-韩家炜组
  15. 【C语言入门】ZZULIOJ 1000-1005
  16. 关于彻底卸载手心输入法的终极操作
  17. 人工神经网络概念及组成,人工神经网络基本概念
  18. go 学习笔记之无心插柳柳成荫的接口和无为而治的空接口
  19. 计算机专业考研的好学校排名2015,计算机类专业考研最好的学校排名
  20. 深入浅出监控神器Prometheus

热门文章

  1. 软件分发、补丁推送排错
  2. cisco vrrp
  3. Xamarin Essentials教程磁力计Magnetometer
  4. 闭关修炼——two——struts2
  5. android WebView总结
  6. (转)WCF光芒下的Web Service
  7. 海量数据库解决方案2011032301
  8. 算法---字符串去重
  9. 算法----------快乐数 (Java版本)
  10. MethodTrace 生成的trace文件为空