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 = 0
def __init__(self,name,role):
self.name = name
self.role = role
LOL.__GetTeam() @classmethod
def __GetTeam(cls):
cls.__num += 1 #修改类的静态私有属性__num只能在类的额内部通过类名才能调用 @classmethod
def getnum(cls):
return cls.__num gailun = 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 = name
self.role = role
self.func() @staticmethod
def 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 = hight
self.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 = argv
print('修改的时候执行我') @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 = hight
self.weight = weight def get_bmi(self):
self.bmi_num = self.hight/(self.weight**2)
return self.bmi_num def set_bmi(self,argv):
self.bmi_num_replace = argv
print('修改的时候执行我') 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的代码表述,因为定义其中一个之前另一个必须存在,所以这个只作为了解。

python学习之面向对象(三)的更多相关文章

  1. python学习day21 面向对象(三)嵌套/特殊方法

    1.嵌套 类/方法/对象都可以当做变量或嵌套到其他类型中. 函数的参数可以是任意类型. 可哈希(不可变)数据类型可以做字典的key. 类和对象可以做字典的key. 2.特殊方法(8) __init__ ...

  2. Python学习之==>面向对象编程(二)

    一.类的特殊成员 我们在Python学习之==>面向对象编程(一)中已经介绍过了构造方法和析构方法,构造方法是在实例化时自动执行的方法,而析构方法是在实例被销毁的时候被执行,Python类成员中 ...

  3. python学习心得第三章

    python学习心得第三章 1.三元运算 变量=值1 if 条件 else 值2 由图如果条件成立则赋值1给变量,如果条件不成立则赋值2给变量. 2.数据类型 集合:set() class set(o ...

  4. Python学习系列(三)(字符串)

    Python学习系列(三)(字符串) Python学习系列(一)(基础入门) Python学习系列(二)(基础知识) 一个月没有更新博客了,最近工作上有点小忙,实在是没有坚持住,丢久又有感觉写的必要了 ...

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

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

  6. Python学习笔记(三)字符串类型及其操作(2)

    1.字符串的表示 字符串是字符的序列表示,可以由一对单引号(‘).双引号(“)或三引号(’‘’)构成.其中,单引号.双引号和三引号都可以表示单行字符串,但是只有三引号可以表示多行字符串 在使用双引号时 ...

  7. Python学习系列(三)Python 入门语法规则1

    一.注释 ''' 多行注释 ''' #单行注释 '''    #example1.1 测试程序  时间:4/17/2017 i1=input("请输入用户名:") i2=input ...

  8. Python学习一(面向对象和函数式编程)

    学习了一周的Python,虽然一本书还没看完但是也收获颇多,作为一个老码农竟然想起了曾经荒废好久的园子,写点东西当做是学习笔记吧 对Python的语法看的七七八八了,比较让我关注的还是他编程的思想,那 ...

  9. python学习 day23 面向对象三大特性之继承

    ### 面向对象三大特性值继承#### 1.什么是继承 继承是一种关系,必须存在两个对象才可能产生这种关系,在现实生活中的继承,王思聪可以继承王健林的财产 被继承的成为父,继承的一方成为子 在程序中, ...

随机推荐

  1. Python核心技术与实战——二一|巧用上下文管理器和with语句精简代码

    我们在Python中对于with的语句应该是不陌生的,特别是在文件的输入输出操作中,那在具体的使用过程中,是有什么引伸的含义呢?与之密切相关的上下文管理器(context manager)又是什么呢? ...

  2. 2018年最佳JavaScript数据可视化和图表库

    现在有很多图表库,但哪一个最好用?这可能取决于许多因素,如业务需求,数据类型,图表本身的目的等等.在本文中,每个JavaScript图表库将与一些关键因素进行比较,包括图表类型,商业或免费和开源状态. ...

  3. Nginx虚拟主机多server_name的顺序问题

    Nginx虚拟主机多server_name的顺序问题  大 | 中 | 小  [ 2008-11-28 11:27 | by 张宴 ] [文章作者:张宴 本文版本:v1.0 最后修改:2008.11. ...

  4. Acwing-97-约数之和(整数分解, 递推分治)

    链接: https://www.acwing.com/problem/content/99/ 题意: 假设现在有两个自然数A和B,S是AB的所有约数之和. 请你求出S mod 9901的值是多少. 思 ...

  5. 浅谈js获取客户端IP

    JS前端获取客户端IP的方法基本都是通过三方接口: 常用的方法1: <script src="http://pv.sohu.com/cityjson?ie=utf-8"> ...

  6. 29. ClustrixDB 分布式架构/并发控制

    介绍 ClustrixDB使用多版本并发控制(MVCC)和2阶段锁(2PL)的组合来支持混合的读写工作负载.在我们的系统中,读取器享受无锁快照隔离,而写入器使用2PL来管理冲突.并发控制的组合意味着读 ...

  7. Java多线程和并发(八),synchronized底层原理

    目录 1.对象头(Mark Word) 2.对象自带的锁(Monitor) 3.自旋锁和自适应自旋锁 4.偏向锁 5.轻量级锁 6.偏向锁,轻量级锁,重量级锁联系 八.synchronized底层原理 ...

  8. javascript中的原型和原型链(三)

    1. 图解原型链 1.1 “铁三角关系”(重点) function Person() {}; var p = new Person(); 这个图描述了构造函数,实例对象和原型三者之间的关系,是原型链的 ...

  9. python实现一个朴素贝叶斯分类方法

    1.公式 上式中左边D是需要预测的测试数据属性,h是需要预测的类:右边式子分子是属性的条件概率和类别的先验概率,可以从统计训练数据中得到,分母对于所有实例都一样,可以不考虑,所有只需 ,返回最大概率的 ...

  10. 详解vue的diff算法原理

    我的目标是写一个非常详细的关于diff的干货,所以本文有点长.也会用到大量的图片以及代码举例,目的让看这篇文章的朋友一定弄明白diff的边边角角. 先来了解几个点... 1. 当数据发生变化时,vue ...