property 内置装饰器函数 只在面向对象中使用

from math import piclass Circle:def __init__(self, r):self.r = r@property    # 将类似属性却需要操作得到的一些方法伪装成对象属性def perimeter(self):return 2 * pi * self.r@propertydef area(self):return pi * self.r ** 2circle = Circle(5)
print(circle.perimeter)  # 调用方法和操作属性相同   本质上还是方法
print(circle.area)

  property 提供私有属性的查看,修改和删除

class Person:def __init__(self, name):self.__name = name@propertydef name(self):return self.__name@name.setter   # 修改 通过赋值来修改def name(self, new_name):self.__name = new_name@name.deleterdef name(self):del self.__namep = Person('zxc')
print(p.name)  # zxc
p.name = 'zxf'
print(p.name)  # zxf
del p.name  # 这里的del只是对应@name.deleter,主要看@name.deleter下面的方法执行了什么
# print(p.name)  # 报错 显示没有name属性

  classmethod和staticmethod

class Person:__key = '人类'def __init__(self, name):self.__name = name@propertydef name(self):return self.__name@classmethod   # 将一个方法变成类中的方法,使这个方法可以直接被类调用而不用依托对象def change_key(cls, new_key):cls.__key = new_keyprint(Person._Person__key)  # 人类
Person.change_key('human')
print(Person._Person__key)  # human
# 当这个方法的操作只涉及静态属性的时候 就应该使用classmethod来装饰这个方法

classmethod

class Login:def __init__(self,name,password):self.name = nameself.pwd = passworddef login(self):pass@staticmethod  # 装饰一个完全跟类和对象没有关系的静态方法,通过类调用def get_usr_pwd():   # 静态方法usr = input('用户名 :')pwd = input('密码 :')Login(usr, pwd)
# 一般用在完全面向对象编程的时候

staticmethod

  isinstance和issubclass

class Person:passclass Student(Person):passp = Person()
print(isinstance(p, Person))  # True  判断p是不是Person的实例化对象
print(issubclass(Student, Person))  # True  判断Student是不是Person的子类
print(issubclass(Person, Student))  # False

  __str__和__repr__

print('zxc')  # 打印对象时,就是调用对象的__str__方法
print(str('zxc'))  # str(obj) 本质就是 obj.__str__
print('zxc'.__repr__())  # 'zxc'   将对象原封不动的打印出来
print(repr('zxc'))   # repr(obj) 本质就是 obj.__repr__
# 格式化输出中的%s和%r就是使用的__str__和__repr__

  自己来个类测试一下

class Person:def __str__(self):return 'str zxc'passzxc = Person()
# print(zxc)  # not zxc  执行了Person类里面的__str__的方法
# 如果注释掉Person类里面的__str__的方法,找不到就到父类里面找,而在新式类中默认继承object,而object中带有__str__方法
print(zxc)  # 打印了对象的内存地址

  测试中发现个有趣的事情,__repr__是__str__备胎。

class Person:def __str__(self):return 'str zxc'def __repr__(self):return 'repr zxc'zxc = Person()
print(zxc)  # str zxc# 注释掉__str__方法
print(zxc)  # repr zxc  说明__repr__方法是__str__的备用方法,当类中找不到__str__就找__repr__,都没有 再去找父类# 重新放开__str__方法,注释掉__repr__方法
print(repr(zxc))  # 打印了对象的内存地址  说明当类里找不到__repr__方法,就直接去父类里找,不能备用__str__

  __del__  构造析构函数

class File:def __del__(self):print('执行了!')file = File()
del file   # 执行了!   再执行__del__函数后,进而删除了对象
print(f)  # 报错 显示找不到对象f

  可能用到的环境:

class File:def __del__(self):self.f.close()print('执行了关闭文件工作!')file = File()
file.f = open('file', 'w')
del file  # 执行了关闭文件工作!
# 可以在删除一个对象之前进行一些收尾的工作

  __call__ 将一个类变为可调用的,当调用时执行__call__函数

class Person:def __init__(self, name):self.name = namedef __call__(self, *args, **kwargs):print('对象的名字是%s' %self.name)person = Person('zxc')
person()  # 对象的名字是zxc# 也可以直接调用类
Person('zzy')()  # 对象的名字是zzy

转载于:https://www.cnblogs.com/zxc-Weblog/p/8326146.html

python面向对象进阶相关推荐

  1. Python面向对象进阶和socket网络编程

    写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese:def __init__(self, ...

  2. Python面向对象进阶与异常、模块以及包管理

    这一篇是面向对象的进阶部分,主要还是面向对象的封装,继承,多态方面的讲解,后面的部分是讲解python异常和模块以及包的部分. 目录 一.Python中的继承 1.什么是继承 2.继承的基本语法 3. ...

  3. Python面向对象进阶及类成员

    再次了解多继承 先来一段代码 #!/usr/bin/env python # _*_ coding:utf-8 _*_ class A:    def bar(self):        print( ...

  4. Python 面向对象进阶

    阅读目录 构造方法.析构方法.__str__ 方法 构造方法 析构方法 __str__ 方法 类的成员 字段(变量) 类变量和实例变量(静态字段 和 字段) 公有/私有 类变量(静态字段) 公有/私有 ...

  5. 【Python面向对象进阶④】——定制类

    Python中的魔法方法 @ author: Flyme awei 方法名 说明 __str__ 用于返回对象的描述 __iter__ 使类可以迭代 __getitem__ 按照下标获取类元素,例如l ...

  6. 定制类【Python面向对象进阶四】

    Python中的魔法方法 @ author: Flyme awei 方法名 说明 __str__ 用于返回对象的描述 __iter__ 使类可以迭代 __getitem__ 按照下标获取类元素,例如l ...

  7. python——面向对象进阶之新增属性和方法

    例如:定义一个类 1.可不可以动态的给对象p赋予一个新的对象属性 1.1 修改实例属性 p.name = 'jam' print(p.name) 1.2 给对象赋予一个新的属性(实例属性) p.sex ...

  8. 【Python】Python面向对象详解

    Python面向对象 Python是一种面向对象的编程语言,因此它支持面向对象编程(OOP).面向对象编程是一种程序设计方法,它将数据和行为打包成对象.对象是类的实例,而类是具有相似属性和行为的一组对 ...

  9. Python之面向对象进阶

    Python之面向对象进阶 进阶有:Python 类的成员.成员修饰符.类的特殊成员. 一.类的成员 类的成员可以分为三大类:字段.方法和属性. 注:所有成员中,只有普通字段的内容保存对象中,即:根据 ...

最新文章

  1. Udacity机器人软件工程师课程笔记(十四)-运动学-正向运动学和反向运动学(其一)
  2. 复习计算机网络基础 day3---什么是计算机网络:
  3. Coolite 中GridView点击行中的按钮时跳转至不同的页面
  4. linux tty core code,linux tty core 源码分析(5)
  5. Centos7下 Redis的安装、配置开机自启动、开放远程连接
  6. c语言中freopen函数,fopen和freopen_C中freopen和fopen的区别(用法+详解+区别)
  7. Oracle查看表空间和表空间中的对象
  8. ASP.NET Core MVC TagHelper实践HighchartsNET快速图表控件
  9. 1024 程序员节专题论坛来袭,聚焦企业级开源数据库 openGauss
  10. android adb 静默安装,Android_如何静默安装
  11. 【Linux】awk指令
  12. Eclipse 中 Could not find *.apk的解决方案
  13. python批处理代码_Python文件夹批处理操作代码实例
  14. 人员管理系统 java_员工管理系统java版
  15. ARKit玩起来 - AR预览唱片-史小川-专题视频课程
  16. UEFI HOB 学习
  17. c语言课程设计成型代码,【图片】发几个C语言课程设计源代码(恭喜自己当上技术小吧主)【东华理工大学吧】_百度贴吧...
  18. 用verilog实现检测1的个数_[转]常用数字处理算法的Verilog实现
  19. 十五天掌握OpenCV——图像上的算术运算
  20. 宝塔平台配置JeecgBoot

热门文章

  1. [转]Google的C++代码规范
  2. Cosmos OpenSSD--greedy_ftl1.2.0(一)
  3. 常使用的webserver地址
  4. [转]31个让你变聪明的方法
  5. SQL中显示查询结果的前几条记录
  6. SpringBoot 2.0静态资源映射
  7. 大数据挖掘在销售管理中的应用价值
  8. CCF 201409-1 相邻数对
  9. Android安全开发之浅谈密钥硬编码
  10. 团队冲刺站立会议03