day25

类的私有成员

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

python所有的私有成员都是纸老虎,形同虚设

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

class A:
name = "李业"
__name = "刚哥" # 私有类的属性 def __func(self): # 私有类的方法
print("in __func")
print(A.__dict__)
print(A._A__name) # 可以获取到 李业
私有类的静态属性
  • 类的内部可以访问
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()
私有对象的属性

只能在类的内部使用,不能在类外部以及子类使用

应用:用户密码

class A:
def __init__(self, name, pwd):
self.name = name
self.__pwd = pwd
def md5(self):
self.__pwd = self.pwd + "123"
obj = A("李业", "liyedsb")

类方法

类名调用的方法,将类名地址自动传给cls参数

类方法:一般就是通过类名去调用的方法,并且自动将类名地址传给cls,但是如果通过对象调用也可以,但是传的地址还是类名地址

类方法的作用:

  • 得到类名可以实例化对象
  • 可以操作类的属性
class A:
def func(self):
print("实例方法") @classmethod
def cls_func(cls):
# print(f"cls---->{cls}")
obj = cls()
print(obj)
print("类方法")
# print(A)
# A.cls_func()
obj1 = A()
obj1.cls_func()

简单应用

创建学生类,只要实例化一个对象,写一个类方法,统计一下具体实例化多少个学生?

class Student:
count = 0 def __init__(self, name, id):
self.name = name
self.id = id
Student.count += 1 @classmethod
def count_a(cls):
print(f"{cls.count}个") obj1 = Student("zdr", 1)
obj2 = Student("zdr1", 2)
obj3 = Student("zdr2", 3)
obj4 = Student("zdr3", 4)
obj5 = Student("zdr4", 5)
Students.count_a()

静态方法

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

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

class A:
def func(self):
print("实例化方法") @staticmethod
def static_func():
print("静态方法")

事例

import time
class TimeTest:
area = "中国" def __init__(self, hour, minute, second):
self.hour = hour
self.minute = minute
self.second = second def change_time(self):
print(f"你想调整的时间:{self.hour}时{self.minute}分{self.second}秒") @staticmethod
def showTime():
return time.strftime("%H:%M:%S", time.localtime()) t = TimeTest(2, 10, 10)
t.change_time()
print(TimeTest.showTime())

属性

将动态方法 伪装 成了一个属性,虽然在代码级别上没有什么提升,但是让你看起来更合理.

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 将执行一个函数需要函数名()变换成直接函数名.
# 将动态方法 伪装 成了一个属性,虽然在代码级别上没有什么提升,但是让你看起来更合理.
# obj.bmi
# obj.bmi
# obj.bmi = 666
#
# del obj.bmi # 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
# 应用场景:
# 1, 面试会考一些基本的调用,流程.
# 2, 工作中如果遇到了一些类似于属性的方法名,可以让其伪装成属性.

设置属性的两种方式:

  • 利用装饰器设置属性
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 无法得到返回值
  • 利用实例化对象的方式设置属性
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

isinstance、issubclass的区别

isinstance函数

判断的是对象和类的关系

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

class A:
pass class B(A):
pass obj = B()
print(isinstance(obj, B)) # True
print(isinstance(obj, A)) # True
issubclass函数

类与类之间的关系

issubclass(a,b):判断的是 a类是否是b类的子孙类

class A:
pass class B(A):
pass class C(B):
pass
print(issubclass(B,A)) # True
print(issubclass(B,A)) # True

总结

私有成员:只能在类的内部调用

类方法:@classmethod 类名--->cls 实例化对象,操作类的属性

静态方法:@staticmethod 保持代码的一致性,提高代码的维护性

属性:将方法 伪装 成属性,看起来更合理

issubclass(a,b) :a 是否是 b的子孙类

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

day25——私有成员、类方法、静态方法、属性、isinstance和issubclass的区别的更多相关文章

  1. Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type())

    Python进阶----类的结构(公有成员 , 私有成员(私有属性,私有方法),类方法,静态方法,属性) ,isinstance 和issubcalss ,元类(type()) 一丶类的结构细分    ...

  2. 面向对象~~类的成员: 私有成员,公有成员, 实例方法, 类方法, 静态方法, 属性(property), isinstance ,issubclass, 元类(type)

    一 私有成员公有成员 公有成员: 在任何地方都能访问 私有成员: 只有在类的内部才能访问 类从加载时,只要遇到类中的私有成员,都会在私有成员前面加上_类名 二 实例方法 实例方法就是类的实例能够使用的 ...

  3. Python面向对象05 /私有成员、类方法、静态方法、属性、isinstance/issubclass

    Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/issubclass 目录 Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/is ...

  4. python 面向对象专题(五):私有成员、类方法、静态方法、属性、isinstance/issubclass

    https://www.cnblogs.com/liubing8/p/11325421.html 目录 Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/issubc ...

  5. Python面向对象静态方法,类方法,属性方法

    Python面向对象静态方法,类方法,属性方法 属性: 公有属性 (属于类,每个类一份) 普通属性 (属于对象,每个对象一份) 私有属性 (属于对象,跟普通属性相似,只是不能通过对象直接访问) 方法: ...

  6. python的类的 静态属性 类方法 静态方法

    一.静态属性 静态属性说的就是数据属性 1.定义一个房间的类,求下这个房间的面积 class Room: def __init__(self,name,ower,width,length,heigh) ...

  7. python学习笔记(二十二)实例变量、实例方法、类变量、类方法、属性方法、静态方法

    实例变量:在类的声明中,属性是用变量来表示的.这种变量就称为实例变量,也就是成员变量. 实例方法:在类中声明的方法,例如:my(self),必须实例化之后才可以使用,否则会报错. 类变量:公共的变量, ...

  8. Python 静态方法、类方法和属性方法

    Python 静态方法.类方法和属性方法 静态方法(staticmethod) staticmethod不与类或者对象绑定,类和实例对象都可以调用,没有自动传值效果,Python内置函数staticm ...

  9. Python的程序结构[1] -> 方法/Method[1] -> 静态方法、类方法和属性方法

    静态方法.类方法和属性方法 在 Python 中有三种常用的方法装饰器,可以使普通的类实例方法变成带有特殊功能的方法,分别是静态方法.类方法和属性方法. 静态方法 / Static Method 在 ...

随机推荐

  1. 浏览器正在等待locatehost的响应

    1.问题描述 在进行了几次增删改查操作后,浏览器显示浏览器正在等待locatehost的响应: 2.错误原因: 对数据库为关闭相应的资源. 3.解决方案: 关闭JDBC开启的资源:

  2. pipelinewise 学习一 docker方式安装

    pipelinewise 没有提供基于pip 包的模式进行安装,而且推荐使用docker 以及源码的方式 以下是一个使用docker运行的方式 安装   git clone https://githu ...

  3. type of的返回值有哪些

    typeof 10; // number typeof 'time'; //string typeof undefined; // undefined typeof null; // object t ...

  4. nginx之rewrite相关功能

    Nginx Rewrite相关功能 Nginx服务器利用ngx_http_rewrite_module 模块解析和处理rewrite请求,此功能依靠 PCRE(perl compatible regu ...

  5. nginx 访问控制之 location

    在生产环境中,我们会对某些特殊的请求进行限制,比如对网站的后台进行限制访问. 这就用到了location配置. 示例1: location /aming/ { deny all; } 说明:针对/am ...

  6. LCA的几种做法

    P3379 LCA $ 1:$蜗牛爬式 void dfs(int u,int fa) { f[u]=fa;//预处理father for(int i=head[u]; i; i=e[i].nxt) i ...

  7. spring boot整合websocket之使用自带tomcat启动项目报错记录

    项目中用到websocket,就将原来写好的websocket工具类直接拿来使用,发现前端建立连接的时候报404,经查找发现是因为原来用的是配置的外部tomcat启动,这次是spring boot自带 ...

  8. 深入SaltStack

    [译者注] 这是一篇发表在opencredo官网的博文,通过比较流行的Puppet和新发展起来的Salt,详细地介绍了Salt的功能.在征得原作者的同意后,翻译出来,与大家分享.初次翻译长文,请大家指 ...

  9. Server Tomcat v8.5 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.

    Server Tomcat v9.0 Server at localhost was unable to start within 45 seconds. If the server requires ...

  10. 028_Mac急救箱快捷键

    一. (1) 1.shift + control + option + 电源键 +长按10秒 "重置系统管理器" 2.option + command + P + R + 按1下电 ...