类的成员
今日内容
-
私有成员 公有成员
类的私有成员 : 私有类的静态属性,私有类的方法,私有对象的属性.
-
实例方法
-
类方法 重点
-
静态方法
-
属性 重点
-
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