python 面向对象专题(五):私有成员、类方法、静态方法、属性、isinstance/issubclass
https://www.cnblogs.com/liubing8/p/11325421.html
1. 私有成员
私有类的属性:在内部可以访问(本类内部方法中),类的外部不能访问
代码示例:
# 在内部可以访问(本类内部方法中)
class A:
name = '张三'
__name = '李四' # 私有类的属性
def func(self):
print(self.name)
print(self.__name)
obj = A()
obj.func() # 类的外部不能访问
class A:
name = '张三'
__name = '李四' # 私有类的属性
def func(self):
pass
obj = A()
print(obj.name)
print(A.__name) # 报错
print(obj.__name) # 报错私有对象属性:只能在类的内部使用,不能在外部及派生类中使用
代码示例:
class A:
name = '张三'
__name = '李四' class B(A):
def func(self):
print(self.__name) obj = B()
print(obj.__name) # 不可以
obj.func() # 不可以私有类的方法:只能在类的内部使用,不能在外部及派生类中使用
代码示例:
class A: def func(self):
self.__func()
print('in A func') def __func(self):
print('in A __func') obj = A()
obj.func() # 可以
obj.__func() # 不可以对于私有类成员来说:当你遇到重要的数据/功能,(只允许本类使用的一些方法,数据)设置成私有成员
Python中所有私有成员都是纸老虎,形同虚设,类在加载时,只要遇到类中的私有成员,都会在私有成员前面加上_类名
代码示例:
class A: name = '张三'
__name = '李四' # 私有类的属性 def __func(self):
print('in __func') print(A.__dict__)
print(A._A__name)
2. 类方法
方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。
类方法:一般就是通过类名去调用的方法,并且自动将类名地址传给cls,如果通过对象调用也可以,但是传的地址还是类名地址,并不是所有实例化都是在类外面
类方法的作用:得到类名可以实例化对象,可以操作类的属性
定义:使用装饰器@classmethod.第一个参数必须是当前类对象,该参数名一般约定为“cls”,通过它来传递类的属性和方法(不能传实例的属性和方法)
代码示例:
class A:
def func(self):
print('实例方法')
@classmethod
def cls_func(cls):
print(f'cls---->{cls}')
print('类方法')
print(A)
A.cls_func()
obj = A()
obj.cls_func()应用示例:创建学生类,只要实例化一个对象,写一个类方法,统计一下具体实例化多少个学生?
class Student:
count = 0
def __init__(self,name,id):
self.name = name
self.id = id
Student.addnum()
@classmethod
def addnum(cls):
cls.count = cls.count + 1
@classmethod
def getnum(cls):
return cls.count obj1 = Student('张三', 12343243243)
obj2 = Student('李四', 12343243243)
obj3 = Student('王五', 12343243243) print(Student.getnum())
3. 静态方法
静态方法:不依赖对象与类的,其实静态方法就是函数
作用:保证代码的规范化,合理的划分,后续维护性高
定义:使用装饰器@staticmethod.参数随意,没有“self”和“cls”参数,但是方法体中不能使用类或实例的任何属性和方法
代码示例:
import time
class TimeTest(object):
def __init__(self, hour, minute, second):
self.hour = hour
self.minute = minute
self.second = second
@staticmethod # 相当于函数的作用
def showTime():
return time.strftime("%H:%M:%S", time.localtime())
print(TimeTest.showTime())
t = TimeTest(2, 10, 10)
nowTime = t.showTime()
print(nowTime)
4. 属性
属性:property将执行一个函数需要函数名(),换成直接函数名
将动态方法伪装成一个属性,虽然在代码级别上没有什么提升,但是让你看起来更合理代码示例:
class Bmi:
def __init__(self,name,height,weight):
self.name = name
self.height = height
self.weight = weight
def bmi(self):
return self.weight/self.height**2
obj = Bmi(张三', 1.83, 65)
print(obj.bmi())# 结果虽然实现了,但是逻辑上感觉不合理.bmi应该是类似于name,age,height等名词,但是把它当做方法使用了.class Bmi:
def __init__(self,name,height,weight):
self.name = name
self.height = height
self.weight = weight
@property
def bmi(self):
return self.weight/self.height**2
obj = Bmi('张三', 1.83, 65)
print(obj.bmi) # property 将执行一个函数需要函数名()变换成直接函数名.
# 将动态方法 伪装 成了一个属性,虽然在代码级别上没有什么提升,但是让你看起来更合理.property 是一个组合
class Foo:
@property
def bmi(self):
print('get的时候运行我啊')
@bmi.setter
def bmi(self,value):
print(value)
print('set的时候运行我啊')
# return 111 # 无法得到返回值
@bmi.deleter
def bmi(self):
print('delete的时候运行我啊')
# return 111 # 无法得到返回值
obj = Foo()
obj.bmi
obj.bmi = 666 # 操作命令 这个命令并不是改变bmi的值,而是执行被bmi.setter装饰器装饰的函数
obj.bmi(666) # 报错
del obj.bmi # 结果:
get的时候运行我啊
666
set的时候运行我啊
delete的时候运行我啊设置属性的两种方式:
# 1. 利用装饰器设置属性.
class Foo:
@property
def bmi(self):
print('get的时候运行我啊') @bmi.setter
def bmi(self,value):
print(value)
print('set的时候运行我啊')
# return 111 # 无法得到返回值 @bmi.deleter
def bmi(self):
print('delete的时候运行我啊')
# return 111 # 无法得到返回值 2. 利用实例化对象的方式设置属性.
class Foo:
def get_AAA(self):
print('get的时候运行我啊')
def set_AAA(self,value):
print('set的时候运行我啊')
def delete_AAA(self):
print('delete的时候运行我啊')
AAA = property(get_AAA,set_AAA,delete_AAA) #内置property三个参数与get,set,delete一一对应
f1=Foo()
f1.AAA
f1.AAA='aaa'
del f1.AAA
5. 内置函数 isinstance issubclass
isinstance 判断的是对象与类的关系
class A:
pass
class B(A):
pass
obj = B() # isinstance(a,b) 判断的是 a是否是b类 或者 b类派生类 实例化的对象.
print(isinstance(obj, B)) # True
print(isinstance(obj, A)) # Trueissubclass 判断的是类与类之间的关系
class A:
pass
class B(A):
pass
class C(B):
pass # issubclass(a,b) 判断的是 a类是否是b类的派生类 或者 b类派生类 的派生类.
# issubclass(a,b) 判断的是 a类是否是b类 子孙类.
print(issubclass(B,A))
print(issubclass(C,A))
6. 总结:
对象如果改变了类的静态属性, 具体他进行了什么操作?
将类中的静态属性变成可变的数据类型.
对象调用类的方法,方法中对类的属性进行改变.对象不能修改类的属性,示例代码如下:
class A:
a = 1
b = 2
def __init__(self):
c = 3
obj1 = A()
obj2 = A()
obj1.a = 3
obj2.b = obj2.b + 3 print(A.a) #
print(obj1.b) #
print(obj2.b) #
print(obj2.c) #报错
python 面向对象专题(五):私有成员、类方法、静态方法、属性、isinstance/issubclass的更多相关文章
- Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type())
Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type()) 一丶类的结构细分 ...
- 『无为则无心』Python面向对象 — 51、私有成员变量(类中数据的封装)
目录 1.私有成员变量介绍 (1)私有成员变量概念 (2)私有成员变量特点 (3)私有成员变量体验 2.属性私有化工作原理 3.定义成员变量的标识符规范 4.私有成员变量的获取和设置方式 1.私有成员 ...
- 面向对象~~类的成员: 私有成员,公有成员, 实例方法, 类方法, 静态方法, 属性(property), isinstance ,issubclass, 元类(type)
一 私有成员公有成员 公有成员: 在任何地方都能访问 私有成员: 只有在类的内部才能访问 类从加载时,只要遇到类中的私有成员,都会在私有成员前面加上_类名 二 实例方法 实例方法就是类的实例能够使用的 ...
- Python面向对象之结构与成员
1.面向对象结构分析: ----面相对象整体大致分为两块区域: --------第一部分:静态字段(静态变量)部分 --------第二部分:方法部分 --每个大区域可以分为多个小部分: class ...
- python 面向对象专题(一):面向对象初识、面向对象结构、类、self、实例化对象
https://www.cnblogs.com/liubing8/p/11301344.html 目录 Python面向对象01 /面向对象初识.面向对象结构.类.self.实例化对象 1. 面向对象 ...
- 『无为则无心』Python面向对象 — 52、私有成员方法(类中行为的封装)
Python对于类的成员没有严格的访问控制限制,这与其他面向对象的编程语言是有所区别的. 关于私有方法其实和私有属性差不多,有如下要点: 1.通常我们约定,两个下划线开头的方法是私有方法. 2.类内部 ...
- python 面向对象(类的特殊成员)
python 面向对象: (思维导图 ↑↑↑↑) 类的特殊成员 python的类成员存在着一些具有特殊含义的成员 1.__init__: 类名() 自动执行 __init__ class Foo(ob ...
- python 面向对象专题(十):特殊方法 (三)__get__、__set__、__delete__ 描述符(三)方法是描述符
在类中定义的函数属于绑定方法(bound method),因为用户定义的函数都有 __get__ 方法,所以依附到类上时,就相当于描述符.示例 20-13 演示了从 面向对象专题(九)示例 20-8 ...
- python 面向对象专题(七):异常处理
目录 python面向对象07/异常处理 1. 异常错误分类 2. 什么是异常? 3. 异常处理 4. 为什么要有异常处理 5. 异常处理的两种方式 1.if判断 2.try 6. 常见异常种类 1. ...
随机推荐
- [BZOJ]最长道路
题目 点这里看题目. BZOJ 上是权限题目. 分析 这道题可以用点分治,但是我就是喜欢边分治 QAQ . 分治过程中,我们考虑经过分治边的路径的最大痛苦值.一条经过分治边的路径会被 ...
- Looooops(求解同余方程、同余方程用法)【拓展欧几里得】
Looooops(点击) A Compiler Mystery: We are given a C-language style for loop of type for (variable = A; ...
- 2019-02-13 思考:1000瓶药水,1瓶有毒,老鼠毒发24h,如何用最少的老鼠在24h内找出毒药?
题目: 现在有1000瓶药水,其中一瓶有毒,一只老鼠喝了在24h后会准时死亡,药水无色无味,如何用最少的老鼠在24h内找出毒药? 分析: 时间限制为24h,说明我们只有一次喂老鼠的机会,需要一波找出来 ...
- Spring Cloud 系列之 Alibaba Nacos 配置中心
Nacos 介绍 Nacos 是 Alibaba 公司推出的开源工具,用于实现分布式系统的服务发现与配置管理.英文全称 Dynamic Naming and Configuration Service ...
- Latex 安装 教程
需要安装texlive和编辑器texstudio. 安装教程如https://www.cnblogs.com/dingruihfut/p/9690073.html
- 【vue】axios二次封装,更好的管理api接口和使用
在现在的前端开发中,前后端分离开发比较主流,所以在封装方法和模块化上也是非常需要掌握的一门技巧.而axios的封装也是非常的多,下面的封装其实跟百度上搜出来的axios封装或者axios二次封装区别不 ...
- mongoDB的基本使用方法
MongoDB 安装(乌班图系统) apt install mongodb mongoDB与sql的对比 SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数 ...
- Java中堆栈的区别
简单的说: Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分 ...
- elk5
在百度指数上面可以看到二者热度的一个对比 es要先建立索引index,才能进行检索 elasticSearch的安装 1.jdk要1.8版本以上,并且每台elasticserach的jdk版本要一致 ...
- 【原创】Linux中断子系统(四)-Workqueue
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...