python 学习 [day8]class成员
一、类的成员
类的成员可以分为三大类:字段、方法和属性
注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段。而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份。
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成员相关推荐
- python 学习 [day6]
递归阶乘: 函数自己调用自己循环操作的模式称之为递归 def func(num):if num == 1:return 1return num * func(num - 1)print(func(7) ...
- PS初学者实例教程——图层样式的学习[斜面和浮雕]
本系列教程由中国教程网互助课堂专 为PS新手制作,在这里有系列的教程.练习,并有老师对练习进行点评与指导,欢迎朋友们的光临! 本例我们学习"斜面和浮雕"图层样式 斜 面和浮雕是使用 ...
- [转载] Python学习:Python成员运算符和身份运算符
参考链接: Python中==和is运算符之间的区别 Python成员运算符 除了以上的一些运算符之外,Python还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组. 运算符 描 ...
- 11.15-11.21【大学生Python学习】社区总结+优秀社区成员点名表扬技术书籍和CSDN定制背包奖励~
欢迎每一位小伙伴的加入: 社区:大学生Python学习 文章目录: 11.15-11.21的社区总结: 优秀群成员点名表扬&&技术书籍和CSDN定制背包奖励: 排名第一位:[X ...
- python学习第十二天
"笨办法学python"小结 对于<笨办法学Python>的学习基本上是学习完毕了,但是还需要勤加练习,个人认为要学好这个东西唯有多敲代码,多读代码,多记忆才是主要途径 ...
- Python学习的十个阶段,学完大成,对应一下看看你自己在哪个阶段
大家好,我是梦雅. \ 今天给大家整理了Python学习的十个阶段内容,看看你现在正处于哪个阶段,想学习的朋友也可以根据这个阶段规划学习. \ \ \ 阶段一:Python基础[ 初入江湖] \ Li ...
- python学习之第四课时--运算符
python学习之第四课时--运算符 运算符 1.算数运算 运算符 描述 实例 a=10,b=20 = 加,两个对象相加 a+b输出30 - 减,一个数减去另一个数 a-b输出-10 * 乘,两个数相 ...
- Python 学习之二: module, import 与 import as
2019独角兽企业重金招聘Python工程师标准>>> http://blog.csdn.net/fanshengchong/article/details/7039692 Pyth ...
- Linux RCU机制详解[转]
一:前言 RCU机制出现的比较早,只是在linux kernel中一直到2.5版本的时候才被采用.关于RCU机制,这里就不做过多的介绍了,网上有很多有关RCU介绍和使用的文档.请自行查阅.本文主要是从 ...
最新文章
- iOS使用自签名证书实现HTTPS请求
- node.js java web_Node.js 做 Web 后端优势为什么这么大?
- 05构建之法阅读笔记之三
- 一个19岁美国少年眼中的各种社交应用
- VTK:图片之ImageConvolve
- MySQL中字符串函数详细介绍
- leetcode - 467. 环绕字符串中唯一的子字符串
- Google hacker的***方法
- 串结构练习--字符串匹配
- pytorch: 将一序列操作串联
- LINUX用C建立多级目录(测试通过)
- Python中的输入输出(IO)
- Android中向ContactsProvider中插入大量联系人
- 【论文翻译 arXiv 2020】异质网表示学习综述-韩家炜组
- 【C语言入门】ZZULIOJ 1000-1005
- 关于彻底卸载手心输入法的终极操作
- 人工神经网络概念及组成,人工神经网络基本概念
- go 学习笔记之无心插柳柳成荫的接口和无为而治的空接口
- 计算机专业考研的好学校排名2015,计算机类专业考研最好的学校排名
- 深入浅出监控神器Prometheus