6.8 类的结构细化

6.8.1 类的私有成员

类中的私有成员包括:私有类的属性,私有对象属性,私有类方法

私有静态属性

类的内部可以访问,类的外部不可以访问,派生类中不可以访问

class A:__a = 'a'__b = 'b'def func(self):print(self.__a)print(self.__b)class B(A):def func(self):print(self.__a)print(self.__b)obj = B()
print(A.__a)    #类的外部不行
print(obj.__a)  #类的外部不行
obj.func()      #派生类中不行
A.func(obj)     #类的内部可以
私有对象属性

类的内部可以访问,类的外部不可以访问,派生类中不可以访问

class A:a = 'aa'def __init__(self):self.__b = 'bb'self.__c = 'cc'self.bb = 'b'self.cc = 'c'def func(self):print(self.__b)class B(A):def func(self):print(self.__b)print(self.bb)obj = B()
print(obj.__b)   #类的外部不行
print(A.__b)     #类的外部不行
B.func(obj)      #派生类中不行
A.func(obj)      #类中可以  
私有类方法

类的内部可以访问,类的外部不可以访问,派生类中不可以访问

class B:school_name = 'QQDX'def __func(self):print('hello')def fine(self):self.__func()print('hi')class A(B):class_name = 'python'def fine(self):print(self.class_name)self.__func()obj = A()
print(obj.class_name)
# B.__func()    #在类的外部不可以
B.fine(obj)     #在类的内部可以
A.fine(obj)

【用处】设定一些私有的或者不想让类外用,例如密码,加密方式等可以设置成私有成员

【拓展】私有成员除了在类的内部,其他方式真的访问不到吗?

python中的私有成员:就是在私有成员全面加上 _类名而已,可以根据这个方式进行调用。实际应用中,千万不要这么用!!!

class A:__a = 'a'__b = 'b'def func(self):print(self.__a)print(self.__b)class B(A):def func(self):print(self.__a)print(self.__b)print(A.__dict__)
print(A._A__a)
输出:
{'__module__': '__main__', '_A__a': 'a', '_A__b': 'b', 'func': <function A.func at 0x00000155D52ADC80>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
a

6.8.2 类的方法

类的方法大致分为:实例方法,类方法,静态方法,双下方法

类方法classmethod

类方法,由类直接调用操作的方法,会自动将类名传给cls

class A: @classmethod      #类方法def  func(cls):     pass

对象也可以调用这个类的函数,但是函数执行时,会自动将从属的类名传给cls,而非对象名

class LOL:__num = 0def __init__(self,name,role):self.name = nameself.role = roleLOL.__GetTeam()@classmethoddef __GetTeam(cls):cls.__num += 1  #修改类的静态私有属性__num只能在类的额内部通过类名才能调用@classmethoddef getnum(cls):return  cls.__numgailun = LOL('盖伦','战士')
nvjing = LOL('女警','射手')
qinnv = LOL('萨娜','辅助')
zhaoxin = LOL('赵信','打野')
akali = LOL('阿卡丽','刺客')print(LOL.getnum())
静态方法staticmethod

不依赖于类,也不依赖于对象,在类内部不需要穿self参数,仅仅就是一个独立的函数,只是放在类的内部而已,使代码结构更加清晰合理。使用时可以用类或者对象调用即可。

【语法】

class A: @staticmethod      #静态方法def  func():        pass

【使用】

class LOL:def __init__(self,name,role):self.name = nameself.role = roleself.func()@staticmethoddef func():print('为啥要用@staticmethod')print('可以把普通函数放到类的里边')gailun = LOL('盖伦','战士')

6.8.3 类的属性伪装

property类

执行被装饰函数时,可以省去()这一步,并返回函数的返回值

property可以单独使用,也可以与setter和deleter一起使用,但是setter和deleter使用时,必须要有property

class BMI:def __init__(self,hight,weight):self.hight = hightself.weight = weight@property  #伪装,执行这个函数时可以不用加括号;名词做了动词的事,给他加特效后,名词感觉就是名词了def bmi(self):self.bmi_num = self.hight/(self.weight**2)return self.bmi_num@bmi.setter   #伪装修改操作def bmi(self,argv):self.bmi_num_replace = argvprint('修改的时候执行我')@bmi.deleter  #伪装删除操作def bmi(self):print('删除的时候执行我')a = BMI(60,1.76)
bmi = a.bmi
del a.bmi
a.bmi = 20.5
print(a.bmi_num_replace)

设置setter和deleter时不能设置与类重名的对象属性名,且伪装函数中不能设置return

还可以表示为,跟上边是一模一样的:

class BMI:def __init__(self,hight,weight):self.hight = hightself.weight = weightdef get_bmi(self):self.bmi_num = self.hight/(self.weight**2)return self.bmi_numdef set_bmi(self,argv):self.bmi_num_replace = argvprint('修改的时候执行我')def del_bmi(self):print('删除的时候执行我')bmi = property(get_bmi,set_bmi,del_bmi)  #内置property三个参数与get,set,delete一一对应a = BMI(60,1.76)
print(a.bmi)
a.bmi = 20
del a.bmi
print(a.bmi_num_replace)

property类内置了查询,修改,删除函数,传参时一定要一一对应

6.8.4 isinstance和issubclass和type

isinstance

isinstance(a,b):判断a对象是否是b类(或者b类的派生类)实例化的对象

class A:pass
class B(A):pass
class C(B):pass
class D(C):pass
obj = D()
print(isinstance(obj,C))
print(isinstance(obj,B))
print(isinstance(obj,A))
issubclass

issubclass(a,b): 判断a类是否是b类(或者b的派生类)的派生类

class A:pass
class B(A):pass
class C(B):pass
class D(C):pass
class E(D,B):pass
class F:pass
print(issubclass(D,A))  # True
print(issubclass(E,A))  # True
print(issubclass(F,A))  # False
type

type判断的是从属于哪个类

print(type('aa'))
print(type(0))
print(type(object))
class A:pass
print(isinstance(object,type))
print(isinstance(A,type))

type元类是获取该对象从属于的类,而type类比较特殊,因为python原则是一切皆对象,那么就可以把类理解为'对象',而type元类又称作构建类,是python中大多数内置的类(包括object)以及自己定义的类,都是由type元类创造的。

这里只做谅解type类与object类之间的关系比较独特:object是type类的实例,而type类是object类的子类,这种关系比较神奇无法使用python的代码表述,因为定义其中一个之前另一个必须存在,所以这个只作为了解。

转载于:https://www.cnblogs.com/jjzz1234/p/11172277.html

python学习之面向对象(三)相关推荐

  1. python学习之第三课时--基本数据类型及区别,变量

    python学习之第三课时--基本数据类型及区别,变量 基本数据类型及区别 1. 数字类型(int) 数字型--变量值直接是数字,没有双引号""   整数 2. 浮点数(float ...

  2. Python学习之面向对象编程

    Python学习目录 在Mac下使用Python3 Python学习之数据类型 Python学习之函数 Python学习之高级特性 Python学习之函数式编程 Python学习之模块 Python学 ...

  3. Python学习之面向对象高级编程

    Python学习目录 1. 在Mac下使用Python3 2. Python学习之数据类型 3. Python学习之函数 4. Python学习之高级特性 5. Python学习之函数式编程 6. P ...

  4. python学习手册中文版免费下载-Python学习手册 第三版

    <Python学习手册(第3版)>讲述了:Python可移植.功能强大.易于使用,是编写独立应用程序和脚本应用程序的理想选择.无论你是刚接触编程或者刚接触Python,通过学习<Py ...

  5. python三大圣经-读书分享全网学习资源大合集,推荐Python学习手册等三本书「01」...

    0.前言 在此之前,我已经为准备学习python的小白同学们准备了轻量级但超无敌的python开发利器之visio studio code使用入门系列.详见 1.我是谁 我是一个使用python超10 ...

  6. Python 学习笔记 第三篇 Python实现网易云评论网页爬虫+词云展示 (Pycharm+Mysql)

    初始条件,具体可见我的其他文章. 1.安装Python.Python 学习笔记 第一篇 Python的安装与配置 2.安装Pycharm,并导入第三方包.Python 学习笔记 第二篇 Python ...

  7. idea的jsp如何显示语法高亮_如何啃下Python学习中的三块硬骨头?

    Python 根式字 [51CTO.com快译]众所周知,作为一门开源的高级编程语言,Python的用途十分广泛.它可以被用于不同的应用场景中,包括:开发基于桌面和Web的应用程序,分析访问数据,开发 ...

  8. Python学习之面向对象

    1. 前言 上次学习了Python的基本语法,这次学面向对象,本博客主要介绍Python的面向对象和一些常用的类.本博客不太适合小白,适合有一定的编程基础的童鞋. 学习资料主要来自两处: B站Pyth ...

  9. 从零开始学习python编程-从0开始的Python学习014面向对象编程(推荐)

    简介 到目前为止,我们的编程都是根据数据的函数和语句块来设计的,面向过程的编程.还有一种我们将数据和功能结合起来使用对象的形式,使用它里面的数据和方法这种方法叫做面向对象的编程. 类和对象是面向对象编 ...

最新文章

  1. linux字符界面教程,打造字符界面的多媒体Linux系统
  2. c++类与类的关联(Association)关系
  3. 丘成桐在CNCC会议的演讲全文
  4. Linux删除乱码文件
  5. *ecshop 限制文章帮助文章显示条数
  6. paip.使用JAVASCRIPT开发桌面与WEB程序
  7. WIn10桌面美化(一)Rainmeter的使用
  8. SIFT算法应用:全景图像拼接
  9. k2p B1版本官改关闭路由器ipv6分配
  10. 推荐的接口管理平台-yapi
  11. 76篇 ICCV 2019 论文实现代码
  12. 京东、京东全球购、考拉等电商平台入驻费用详解
  13. 物资学院、草房、常营点过的外卖总结
  14. RTI路由服务---跨多个平台,系统和网络扩展和集成DDS系统
  15. 迅雷下载器-FDM,看2019新年大电影
  16. 仿射变换 Affine transformation
  17. 【基础编程题目集编程题及其答案】
  18. c语言最大字符1025,leetcode1025(除数博弈)--C语言实现
  19. 计算机开机跳过硬盘检查,怎么跳过开机硬盘自检的三个方法
  20. Linux学习教程(一)

热门文章

  1. SharePoint 2010 文档库添加文件icon
  2. oracle设置超时时间
  3. .NET Framework 3.5 SP1 bootstrapper 包(安装和部署)的解决方法
  4. ASP.NET 2.0中的表达式构造器(Expression Builder)
  5. python自动化办公入门书籍推荐-用python进行办公自动化都需要学习什么知识呢?...
  6. 怎么在python下载网站内容-用Python下载一个网页保存为本地的HTML文件实例
  7. python安装numpy模块-python的numpy模块安装不成功简单解决方法总结
  8. python实现简单的api接口-对Python实现简单的API接口实例讲解
  9. python装饰器函数-Python精进-装饰器与函数对象
  10. python使用符号 表示单行注释-Pyhton中单行和多行注释的使用方法及规范