1.私有成员公有成员

1.1 类的私有属性

  1. # class A:
  2. #
  3. # name = '周道镕'
  4. # __name = 'zdr' # 私有类的属性
  5. #
  6. # def func(self):
  7. # print(self.name)
  8. # print(self.__name)
  9. # obj = A()
  10. # obj.func()
结论:在类的内部可以访问
  1. # class A:
  2. # name = '周道镕'
  3. # __name = 'zdr' # 私有类的属性
  4. #
  5. # def func(self):
  6. # pass
  7. # obj = A()
  8. # print(obj.name)
  9. # print(A.__name) #报错
  10. # print(obj.__name) #报错
结论:类的外部不能访问
  1. # class A:
  2. # name = '周道镕'
  3. # __name = 'zdr' # 私有类的属性
  4. #
  5. # class B(A):
  6. # def func(self):
  7. # print(self.__name)
  8. #
  9. # obj = B()
  10. # # print(obj.__name)
  11. # obj.func() # 报错
结论:类的派生类不能访问

1.2 类的私有方法

  1. # class A:
  2. #
  3. # def func(self):
  4. # self.__func()
  5. # print('in A func')
  6. #
  7. # def __func(self):
  8. # print('in A __func')
  9. #
  10. # obj = A()
  11. # obj.func()
  12. # obj.__func() # 报错
结论:类的私有方法不能在类的外部使用

1.3 对象的私有方法

  1. class A:
  2. def __init__(self,username,pwd):
  3. self.username = username
  4. self.__pwd = pwd
  5. def md5(self):
  6. self.__pwd = self.__pwd + '123'
  7. obj = A("7255322","123456789")
  8. print(obj.__pwd) # 报错
结论: 只能在类的内部使用,不能在类的外部使用以及派生类使用

私有成员来说: 当你遇到重要的数据,功能,(只允许本类使用的一些方法,数据)设置成私有成员.

python的所有私有成员都是纸老虎,形同虚设
  1. class A:
  2. name = '周道镕'
  3. __name = 'zdr' # 私有类的属性#
  4. def __func(self):
  5. print('in __func')
  6. print(A.__dict__)
  7. print(A._A__name)
  8. A._A__func(123)
  9. obj = A()
  10. obj._A__func()

类从加载时,只要遇到类中的私有成员,都会在私有成员前面加上 _类名 .

2.实例方法

实例方法就是类的实例能够使用的方法

  1. class A:
  2. def func(self):
  3. print('实例方法')

3.类方法

加classmethod装饰器的方法就是类方法

  1. class A:
  2. def func(self):
  3. print('实例方法')
  4. @classmethod
  5. def cls_func(cls):
  6. # print(f'cls---->{cls}')
  7. obj = cls()
  8. print(obj)
  9. print('类方法')
  10. # A.cls_func()
  11. # obj = A()
  12. # obj.cls_func()
类方法: 一般就是通过类名去调用的方法,并且自动将类名地址传给cls,但是如果通过对象调用也可以,但是传的地址还是类名地址.

类方法有什么用???

1. 得到类名可以实例化对象.

2. 可以操作类的属性.

4.静态方法

使用装饰器@staticmethod。

  1. # class A:
  2. #
  3. # def func(self):
  4. # print('实例方法')
  5. #
  6. #
  7. # @classmethod
  8. # def cls_func(cls):
  9. # pass
  10. #
  11. # @staticmethod
  12. # def static_func():
  13. # print('静态方法')

静态方法是不依赖于对象与类的,其实静态方法就是函数.

使用了静态方法(函数),然而方法体中并没使用(也不能使用)类或实例的属性(或方法)

保证代码的规范性,合理的划分.后续维护性高.

5.属性

  1. class Bmi:
  2. def __init__(self,name,height,weight):
  3. self.name = name
  4. self.height = height
  5. self.weight = weight
  6. def bmi(self):
  7. return self.weight/self.height**2
  8. obj = Bmi('赵嘎', 1.83, 65)
  9. print(obj.bmi())
  10. # 结果虽然实现了,但是逻辑上感觉不合理.bmi应该是类似于name,age,height,等名词,
  11. # 但是你把它当做方法使用了.
  12. class Bmi:
  13. def __init__(self,name,height,weight):
  14. self.name = name
  15. self.height = height
  16. self.weight = weight
  17. @property
  18. def bmi(self):
  19. return self.weight/self.height**2
  20. obj = Bmi('赵嘎', 1.83, 65)
  21. print(obj.bmi)
  22. # property 将执行一个函数需要函数名()变换成直接函数名.
  23. # 将动态方法 伪装 成了一个属性,虽然在代码级别上没有什么提升,但是让你看起来更合理.
  24. obj.bmi
  25. obj.bmi
  26. obj.bmi = 666
  27. del obj.bmi
  28. # property 他是一个组合.
  29. class Foo:
  30. @property
  31. def bmi(self):
  32. print('get的时候运行我啊')
  33. @bmi.setter
  34. def bmi(self,value):
  35. print(value)
  36. print('set的时候运行我啊')
  37. # return 111 # 无法得到返回值
  38. @bmi.deleter
  39. def bmi(self):
  40. print('delete的时候运行我啊')
  41. # return 111 # 无法得到返回值
  42. obj = Foo()
  43. # obj.bmi
  44. obj.bmi = 666 # 操作命令 这个命令并不是改变bmi的值,而是执行被bmi.setter装饰器装饰的函数
  45. # obj.bmi(666)
  46. del obj.bmi
  47. # 应用场景:
  48. # 1, 面试会考一些基本的调用,流程.
  49. # 2, 工作中如果遇到了一些类似于属性的方法名,可以让其伪装成属性.
  50. # 设置属性的两种方式:
  51. # 1, 利用装饰器设置属性.
  52. class Foo:
  53. @property
  54. def bmi(self):
  55. print('get的时候运行我啊')
  56. @bmi.setter
  57. def bmi(self,value):
  58. print(value)
  59. print('set的时候运行我啊')
  60. # return 111 # 无法得到返回值
  61. @bmi.deleter
  62. def bmi(self):
  63. print('delete的时候运行我啊')
  64. # return 111 # 无法得到返回值
  65. # 2. 利用实例化对象的方式设置属性.
  66. class Foo:
  67. def get_AAA(self):
  68. print('get的时候运行我啊')
  69. def set_AAA(self,value):
  70. print('set的时候运行我啊')
  71. def delete_AAA(self):
  72. print('delete的时候运行我啊')
  73. AAA = property(get_AAA,set_AAA,delete_AAA) #内置property三个参数与get,set,delete一一对应
  74. f1=Foo()
  75. f1.AAA
  76. f1.AAA='aaa'
  77. del f1.AAA

6.issubclass isinstance区别

  1. # isinstance 判断的是对象与类的关系
  2. class A:
  3. pass
  4. class B(A):
  5. pass
  6. obj = B()
  7. # isinstance(a,b) 判断的是 a是否是b类 或者 b类派生类 实例化的对象.
  8. # print(isinstance(obj, B)) # True
  9. # print(isinstance(obj, A)) # True
  10. # issubclass 类与类之间的关系
  11. class A:
  12. pass
  13. class B(A):
  14. pass
  15. class C(B):
  16. pass
  17. # issubclass(a,b) 判断的是 a类是否是b类 或者 b类派生类 的派生类.
  18. # issubclass(a,b) 判断的是 a类是否是b类 子孙类.
  19. # print(issubclass(B,A))
  20. # print(issubclass(C,A))

课外了解

按照Python的一切皆对象理论,类其实也是一个对象,那么类这个对象是从哪里实例化出来的呢?

  1. print(type('abc'))
  2. print(type(True))
  3. print(type(100))
  4. print(type([1, 2, 3]))
  5. print(type({'name': '太白金星'}))
  6. print(type((1,2,3)))
  7. print(type(object))
  8. class A:
  9. pass
  10. print(isinstance(A, type)) # True
  11. print(isinstance(object,type)) # True
  12. print(issubclass(type,object)) # True

type元类是获取该对象从属于的类,而type类比较特殊,Python原则是:一切皆对象,其实类也可以理解为'对象',而type元类又称作构建类,python中大多数内置的类(包括object)以及自己定义的类,都是由type元类创造的。而type类与object类之间的关系比较独特:object是type类的实例,而type类是object类的子类,这种关系比较神奇无法使用python的代码表述,因为定义其中一个之前另一个必须存在。所以这个只作为了解。

百万年薪python之路 -- 面向对象之所有属性及方法的更多相关文章

  1. 百万年薪python之路 -- 面向对象之继承

    面向对象之继承 1.什么是面向对象的继承 继承(英语:inheritance)是面向对象软件技术当中的一个概念. 通俗易懂的理解是:子承父业,合法继承家产 专业的理解是:子类可以完全使用父类的方法和属 ...

  2. 百万年薪python之路 -- 面向对象之 反射,双下方法

    面向对象之 反射,双下方法 1. 反射 计算机科学领域主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省) python面向对象中的反射:通过字符串的形式操作对象相关的属性.python ...

  3. 百万年薪python之路 -- 面向对象之三大特性

    1.面向对象之三大特性 1.1封装 封装:就是把一堆代码和数据,放在一个空间,并且可以使用 对于面向对象的封装来说,其实就是使用构造方法将内容封装到 对象 中,然后通过对象直接或者self间接获取被封 ...

  4. 百万年薪python之路 -- 面向对象之:类空间问题以及类之间的关系

    面向对象之:类空间问题以及类之间的关系 1.从空间角度研究类 1.何处添加对象属性 class A: def __init__(self,name): self.name = name def fun ...

  5. 百万年薪python之路 -- 面向对象初始

    面向对象初始 1.1 面向过程编程vs函数式编程 函数编程较之面向过程编程最明显的两个特点: 1,减少代码的重用性. 2,增强代码的可读性. 1.2 函数式编程vs面向对象编程 面向对象编程:是一类相 ...

  6. 百万年薪python之路 -- JS基础介绍及数据类型

    JS代码的引入 方式1: <script> alert('兽人永不为奴!') </script> 方式2:外部文件引入 src属性值为js文件路径 <script src ...

  7. 百万年薪python之路 -- 数据库初始

    一. 数据库初始 1. 为什么要有数据库? ​ 先来一个场景: ​ 假设现在你已经是某大型互联网公司的高级程序员,让你写一个火车票购票系统,来hold住十一期间全国的购票需求,你怎么写? 由于在同一时 ...

  8. 百万年薪python之路 -- 并发编程之 协程

    协程 一. 协程的引入 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两 ...

  9. 百万年薪python之路 -- 前端CSS样式

    CSS样式 控制高度和宽度 width宽度 height高度 块级标签能设置高度和宽度,而内联标签不能设置高度和宽度,内联标签的高度宽度由标签内部的内容来决定. 示例: <!DOCTYPE ht ...

随机推荐

  1. java中String常见问题

    java中String常见问题 1.字符串比较==和equals ==:比较的是对象,判断两个引用的是否为同一内存地址(物理对象) equals:比较的是值 2.通过空白字符拆封字符串 str.spi ...

  2. Mysql - 关于relay_log_recovery参数的测试

    一.概述 官方文档中对relay_log_recovery参数的解释 Enables automatic relay log recovery immediately following server ...

  3. APP稳定性测试

    APP稳定性测试-monkey测试     第一篇-App稳定性测试-Monkey(基本操作) 准备工作 1.首先下载好adb工具 2.使用数据线连接电脑,打开usb调试 3.使用win+R打开运行, ...

  4. 为elastic的索引做快照并恢复快照到新集群

    1. 为指定的所有做快照 curl -XPUT "192.168.1.1:9200/_snapshot/my_backup/testindex_20170803?wait_for_compl ...

  5. Tomcat启动报错java.lang.ClassNotFoundException: javax.el.ExpressionFactory

    严重: Context initialization failedorg.springframework.beans.factory.BeanCreationException: Error crea ...

  6. Python连载40-协程定义及状态、send语句、yield用法

    一.协程 1.历史进程: (1)3.4引入协程,用yield来实现 (2)3.5引入协程语法 (3)实现协程比较好的包有asyncio,tornado,gevent 2.定义:协程是为非抢占式多任务产 ...

  7. Spring boot - 梳理 - 根本上说,Spring Boot项目只不过是一个普通的Spring项目,只是使用了Spring Boot的起步依赖和自动配置

    根本上说,Spring Boot项目只不过是一个普通的Spring项目,只是使用了Spring Boot的起步依赖和自动配置

  8. redis分布式锁-自动超时锁(在用)

    1.加锁代码结构 2.解锁代码结构 3.java实例 4.测试类 5.测试日志 加锁代码结构 def acquire_lock_with_timeout(conn,lockname,acquire_t ...

  9. Activiti(1) - TaskRuntime API 入门

    目录 TaskRuntime API pom.xml 注册TaskRuntime实例 角色与分组 任务事件监听器 DemoApplication 源码 Activiti 是一个自动化工作流框架.它能帮 ...

  10. CNN之yolo目标检测算法笔记

    本文并不是详细介绍yolo工作原理以及改进发展的文章,只用做作者本人回想与提纲. 1.yolo是什么 输入一张图片,输出图片中检测到的目标和位置(目标的边框) yolo名字含义:you only lo ...