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. Xml解析作业与Xml建模andXml建模作业

    作业:config.xml解析 1.获取所有action中的type的值 public static void main(String[] args) throws Exception { Input ...

  2. nginx 访问控制之 user_agent

    user_agent大家并不陌生,可以简单理解成浏览器标识,包括一些蜘蛛爬虫都可以通过user_agent来辨识. 通过访问日志,可以发现一些搜索引擎的蜘蛛对网站访问特别频繁,它们并不友好. 为了减少 ...

  3. nginx rewrite中的break和last

    两个指令用法相同,但含义不同,需要放到rewrite规则的末尾,用来控制重写后的链接是否继续被nginx配置执行(主要是rewrite.return指令). 示例1:(连续俩条rewrite规则)se ...

  4. HashMap多线程并发问题分析-正常和异常的rehash1(阿里)

    多线程put后可能导致get死循环 从前我们的Java代码因为一些原因使用了HashMap这个东西,但是当时的程序是单线程的,一切都没有问题.后来,我们的程序性能有问题,所以需要变成多线程的,于是,变 ...

  5. leetcode 877. 石子游戏

    题目描述: 亚历克斯和李用几堆石子在做游戏.偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] . 游戏以谁手中的石子最多来决出胜负.石子的总数是奇数,所以没有平局. 亚历克斯和李轮流进行,亚 ...

  6. Vue中使用Sass全局变量

    前言 假设我们原有项目的主题色是蓝色的,这时有个需求,需要把主题色改成橙色的.一般情况下,我们可能会在main.js中引入公共样式文件,但你会发现,在组件中使用公共样式文件中定义的某个参数时,会报一个 ...

  7. windows server core 2016 IIS远程管理的那些坑

    打算从win10访问数据中心版2016 core,结果IIS远程管理不了. 需要修改core上防火墙和注册表,开启一些相关服务. 具体需要如下操作. 1.win10 启用IIS管理特性 2.参考htt ...

  8. pg中与超时设置有关的参数

    statement_timeout控制语句执行时长,单位是ms.超过设定值,该语句将被中止.不推荐在postgresql.conf中设置,因为会影响所有的会话,如非要设置,应该设置一个较大值. loc ...

  9. RocketMQ、Kafka、RabbitMQ的对比

    RocketMQ 相比于 RabbitMQ.Kafka 具有主要优势特性有: 支持事务型消息(消息发送和DB操作保持两方的最终一致性,RabbitMQ 和Kafka 不支持) 支持结合 RocketM ...

  10. postman 用环境变量Environment实现多服务器版本

    现存问题 在测试API期间,往往存在多种环境,对应IP地址(或域名也不同) 比如: Prod: http://116.62.25.57/ucows 用于开发完成发布到生产环境 Dev: http:// ...