今日内容
私有成员 公有成员
类的私有成员 : 私有类的静态属性,私有类的方法,私有对象的属性.
实例方法
类方法 重点
静态方法
属性 重点
Issubclass 和 isinstance 区别 重要
类的私有成员
私有类的属性
# 在类的内部可以使用 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(obj.__name) # 报错
class A: name = "李烨" __name = "刚哥" class B(A): def func(self): print(self.__name) obj = B() 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") print(obj.__pwd) # 报错
私有类的方法 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) # 刚哥
类的其他方法
class A: def func(self): print("实例方法") @classmethod def cls_func(cls): obj = cls() print(obj) print("类方法") obj = A() obj.clas_func()
类方法:一般就是通过类名去调用的方法,并且自动将类名地址传递给 cls(参数),但是如果通过对象调用也可以,但是传的地址还是类名地址
类方法有什么用?
- 得到类名可以实例化对象
- 可以操作类的属性
- 拿到类名,源码有一些方法可以给类开辟空间
简单引用
创建学生类,只要实例化一个对象,写一个类方法,统计一下具体实例化多少个学生?
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 obj = Student("liye",234535465346) obj = Student("weiwuxian",273638383838) print(Student.getnum()) # 2
静态方法
静态方法是不依赖于对象和类的,其实静态方法就是函数
作用:
- 保证代码的规范性,
- 合理的划分,后续维护性高.
类方法与静态方法的区别:
一个是函数 一个是方法
静态不依赖于对象和类 类方法依赖本类的内存地址
class A: def func(self): print("实例方法") @classmethod def cls__func(cls): print("好伤心呀") @staticmethod def static_func(): print("静态方法") obj = A() obj.func() # 实例方法 obj.cls__func() # 好伤心呀 obj.static_func() # 静态方法
属性
Property 将执行一个函数需要函数名()变成直接函数名(调用不加括号)
将动态方法 伪装成一个属性
组合 :
property
setter
deleter
虽然在代码级别上没有什么提升,但是让你看起来更合理
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.85,60) print(obj.bmi()) 结果虽然实现了,但是逻辑上感觉不合理,bim应该类似于 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.85,60) print(obj.bmi) Property 将执行一个函数需要函数名()变成直接函数名 将动态方法 伪装成一个属性,虽然在代码级别上没有什么提升,但是让你看起来更合理 伪装成属性后就可以怎删改查啦 obj.bmi obj.bmi = 666 del obj.bmi
面试会考一些基本的调用,流程
工作中如果遇到一些类似于属性的方法名,可以让其伪装成属性
class Foo: @property def bmi(self): print("get的时候运行我呀") @bmi.setter def bmi(self,value): print(value) @bmi.deleter def bmi(self): print("delete 的时候运行我啊") obj = Foo() obj.bmi obj.bmi = 666 # 操作命令 这个命令并不是改变bmi的值,而是执行被bmi.setter装饰器装饰的函数 # get的时候运行我呀 # 666
设置属性的两种方式
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 # 无法得到返回值 obj = Foo() obj.bmi = 666 # 666 # set 的时候运行我啊
2.利用实例化对象的方式设置属性
class Foo: def get_AAA(self): print('get的时候运行我啊') def set_AAA(self,value): print(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 # 实际上就是调用函数
get的时候运行我啊 aaa set的时候运行我啊 delete的时候运行我啊
内置函数 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)) # True
# issubclass 类与类之间的关系 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))
D