本篇将详细介绍Python 类的成员、成员修饰符、类的特殊成员。

类的成员分为字段、方法和属性

字段:分为普通字段和静态字段,普通字段在每个对象的内存中均保存一份,静态字段仅在类的内存中保存一份

方法:分为普通方法、类方法和静态方法,

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

字段和方法常见使用见下面例子:

 1 #类的成员分为字段、方法和属性
 2 #字段,分为普通字段和静态字段,普通字段属于对象,静态字段属于类
 3 #方法:分为普通方法、静态方法和类方法
 4 #普通方法:由对象调用,至少有一个self参数,执行普通方法时,自动将该方法调用的对象赋值给self
 5 #类方法:由类调用,至少又一个cls参数,执行类方法时,自动将调用该方法的类复制给cls
 6 #静态方法:由类调用,无默认参数
 7 class FOO:
 8     func="我是静态字段"
 9     def __init__(self,name):
10         self.name=name   #普通字段
11
12     def ord_fun(self):
13         print("普通方法,至少有一个self字段",self.name)
14     @classmethod
15     def class_fun(cls):
16         print("类方法,至少有一个cls参数")
17     @staticmethod
18     def static_fun():
19         print("静态方法,无参数")
20
21     @property
22     def prop(self):
23         print("属性调用")
24
25 #普通字段的调用:
26 f=FOO("Eric")
27 print(f.name)
28 #静态字段的调用
29 print(FOO.func)
30
31 #普通方法的调用
32 f.ord_fun()
33 #类方法的调用
34 FOO.class_fun()
35 #静态方法的调用
36 FOO.static_fun()
37 #属性调用,与普通方法的调用一致,定义时仅有一个self参数,调用时无需括号
38 #访问属性时可以制造出和访问字段完全一致的假象
39 #属性由方法变种而来,若没有属性,方法完全可以替代
40 f.prop

属性

1、属性的基本使用

  • 定义时,在普通方法的基础上添加 @property 装饰器;
  • 定义时,属性仅有一个self参数
  • 调用时,无需括号
  • 方法:foo_obj.func()
  • 属性:foo_obj.prop
  • python属性的功能:属性内部进行一系列的逻辑运算,最终将计算结果返回
 1 class Pager(object):
 2     def __init__(self,current_page):
 3         #用户当前请求的页码
 4         self.current_page=current_page
 5         #每页默认显示的条数
 6         self.per_items=10
 7
 8     @property
 9     def start(self):
10         val=(self.current_page-1)*self.per_items+1
11         return val
12     @property
13     def end(self):
14         val=self.current_page*self.per_items
15         return val
16 #
17 p=Pager(2)
18 print("第二页开始:",p.start)
19 print("第二页结束:",p.end)

2、属性的两种定义方法:

  1、装饰器,即在方法上使用装饰器

  2、静态字段,即在类中定义值为property的字段

装饰器:经典类:如上述例子所示,定义属性的方法  @property

    新式类:新式类的属性比经典类的属性丰富

 1 #新式类,具有三种@property装饰器
 2 class Goods(object):
 3     def __init__(self,name):
 4         self.name=name
 5         #原价
 6         self.original_price=100
 7         #折扣价
 8         self.discount=0.8
 9
10     @property
11     def price(self):
12         #实际价格
13         new_price=self.original_price*self.discount
14         return new_price
15
16     @price.setter
17     def price(self,value):
18         #修改商品原价
19         self.original_price=value
20
21     @price.deleter
22     def price(self):
23         #删除商品原价
24         del self.original_price
25
26 obj=Goods("apple")
27 print(obj.price)
28 obj.price=200
29 print(obj.price)
30 del obj.price

静态字段方式:使用静态字段创建属性时,经典类和新式类无区别

静态字段方式创建属性具有三种访问方式,我们可以根据他们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除

 1 class Goods(object):
 2
 3     def __init__(self):
 4         # 原价
 5         self.original_price = 100
 6         # 折扣
 7         self.discount = 0.8
 8
 9     def get_price(self):
10         # 实际价格 = 原价 * 折扣
11         new_price = self.original_price * self.discount
12         return new_price
13
14     def set_price(self, value):
15         self.original_price = value
16
17     def del_price(self, value):
18         del self.original_price
19
20     PRICE = property(get_price, set_price, del_price, '价格属性描述...')
21
22 obj = Goods()
23 obj.PRICE         # 获取商品价格
24 obj.PRICE = 200   # 修改商品原价
25 del obj.PRICE     # 删除商品原价

二、类成员的修饰符

类成员分为:公有成员:在任何地方都能方位

私有成员:只有在类的内部才能访问,私有成员命名时前两个字符是下划线 __name,特殊成员除外(__init__)

 1 #公有成员:在任何地方都能访问。静态:类的对象可以访问,类内部可以访问,派生类可以访问
 2 #私有成员:只有在类的内部才能访问,仅在类内部可以访问
 3 class C(object):
 4     name="公有静态字段"
 5     __na="私有静态字段"
 6     def __init__(self):
 7         self.foo="公有普通字段"
 8         self.__fox="私有普通字段"
 9
10     def func(self):     #类内部访问
11         print(self.foo)
12         print(self.__fox)
13         print(C.name)
14         print(C.__na)
15 class D(C):     #只能访问公有静态字段和公有普通字段
16     def show(self):
17         print(C.name)
18         # print(C.__na)   无法正常访问
19         print(self.foo)
20         # print(self.__fox)    无法正常访问私有字段
21 print("类访问:",C.name)    #类访问
22 # print("类访问私有字段:",C.__na)   #报错,无法访问
23 obj2=C()
24 obj2.func()   #全部可以正常访问,打印四个
25
26
27 obj_d=D()
28 obj_d.show()

类的特殊成员在实际使用中知道即可,故不一一列举

转载于:https://www.cnblogs.com/eric8899/p/6048400.html

面向对象相关知识及常用操作(二)相关推荐

  1. Python os和os.path的基础知识与常用操作

    目录 1 os与os.path的关系 2 os和os.path的常用属性和方法 2.1 os模块常用属性 2.2 os模块常用方法 2.3 os.path模块常用方法 2.3.1 路径的常用操作 2. ...

  2. idea项目相关错误与常用操作教程

    目录 一.创建项目 1.主启动类main函数里面的String无法加载,因为没有导入JDK 2.破坏.idea缓存等导致的启动失败 3.创建web项目的包名应该是小写 二.SSMP实例 1.查询结果为 ...

  3. 二叉搜索树相关知识及应用操作

    文章目录 概念 查找二叉搜索树的第k大节点 概念 二叉查找树(Binary Search Tree),(又名:二叉搜索树,二叉排序树)--它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不 ...

  4. 4.Java面向对象相关知识总结

    一.static关键字 1. static修饰的特点 1.1 被类的所有对象共享,是我们判断是否使用静态关键字的条件. 1.2 随着类的加载而加载,优先于对象存在(即使没有创建对象,也可以通过类名来使 ...

  5. python 列表常用操作(二)

    1.tuple 的 unpack a,b = t 2.格式化输出 print('您的输入:{},值为{}',format(a,b)) 3.日期计算 import datetime as dt impo ...

  6. php面向对象封装mysql_php mysqli面向对象封装mysql数据库常用操作

    首先封装好mysql类 mysql.php class Mysql{ private static $host="localhost"; private static $user= ...

  7. string类的相关知识及部分操作

    文章目录 string对象的初始化 string::size_type类型 string对象的读写操作 使用标准库中的iostream 使用getline读取一整行 string对象的比较操作 str ...

  8. Java 数组常用操作二(扩充、扩容、重复数据、动态数组、数组差集、数组交集、查找指定元素、判断是否相同、数组合并)

    数组扩容(扩充) public class Main {public static void main(String[] args) {String[] names = new String[] { ...

  9. Java之集合(最全集合相关知识)

    集合 集合 一.集合概述 1.为什么要学习集合? 2.定义 3.说明 4.注意 5.集合分类 5.1 单列集合Collection 5.2 双列集合Map 二.Collection接口 1.相关方法 ...

  10. python序列类型-什么是序列,Python序列详解(包括序列类型和常用操作)

    所谓序列,指的是一块可存放多个值的连续内存空间,这些值按一定顺序排列,可通过每个值所在位置的编号(称为索引)访问它们. 为了更形象的认识序列,可以将它看做是一家旅店,那么店中的每个房间就如同序列存储数 ...

最新文章

  1. 中式古建筑su模型大全
  2. chatscript_如何使用ChatScript构建您的第一个聊天机器人
  3. Swift String字符串版本更新特性
  4. SpringMVC _Controller认识(1)
  5. Linux中断线程化的优势,记一个实时Linux的中断线程化问题
  6. aspx调试的时候其他机器也可以打开_VSCode 穿越跳板机调试远程代码
  7. 阿里云ubuntu16.04安装ruby
  8. mysql的关系表_MySQL表关系总结
  9. Stimulsoft Dashboards.WEB 2022.2.3 Crack
  10. Python之shp文件
  11. 搜狗微信文章url解码
  12. 浅聊使用PHP实现微信公众号登录
  13. 【数据应用案例】用户画像与实践案例
  14. Labview2018学习之三:LabVIEW编程
  15. 黄山5日游 最省钱的线路指南
  16. wamp下载和使用PHPDocumentor
  17. 修改openwrt或者LEDE默认wifi名称以及默认开启wifi
  18. 虚拟摄像头之三: 重构android8.1 的 v4l2_camera_HAL 支持虚拟摄像头
  19. 王半仙儿的日记-0002
  20. 非负函数无穷积分的收敛判别法

热门文章

  1. python将txt文档中的内容按字母顺序进行排序,并存入txt中
  2. Java json字符串转Object
  3. vue-cli@webpack@4打包分析命令
  4. 程序员到项目经理:从内而外的提升(比较全面的介绍)
  5. 创建高质量Python工程(1)-如何设计结构清晰的目录结构(转)
  6. 使用sp_addlinkedserver、sp_dropserver 、sp_addlinkedsrvlogin和sp_droplinkedsrvlogin 远程查询数据...
  7. AngularJS学习之旅—AngularJS 事件(十四)
  8. 索引大小对语句执行速度的影响
  9. DoraHacks的笔记
  10. Bzoj 3831: [Poi2014]Little Bird