py 5.28
Posted liujjpeipei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了py 5.28相关的知识,希望对你有一定的参考价值。
#内置函数 #@property(伪装):将一个本意是属性的方法在调用时伪装成直接调用属性(方法名)的样子来调用此函数。 # class A: # def __init__(self,r): # self.r = r # def area(self): # return self.r**2 # print(A(5).area())#变成 # class A: # def __init__(self,r): # self.r = r # @property # def area(self): # return self.r**2 # print(A(5).area) #@被伪装后的方法名.setter : 可以限制给对象的属性赋值的数据类型。或是把伪装后的函数名变成可修改的,变的 # 更像对象的属性。 # class A: # def __init__(self): # self.__name = ‘zhangsan‘ # @property # def name(self): # return self.__name #把私有对象属性返回给调用者。 # @name.setter #name为被伪装之后 # def name(self,new): #必须同名函数。 # self.__name = new #改值或其他操作。 # b = A() # print(b.name) #伪装后的调用。 # b.name = ‘abc‘ #调用setter下面的函数,传入new # print(b.name) #@方法名.deleter #所有借用操作系统的资源,在删除一个伪装或方法属性的变量前,一定要归还资源(f.close()) # class Open: # def __init__(self,path): # self.f = open(path,‘w‘) # @property # def write_in(self): #1 # self.f.write(‘xieru‘) # @write_in.deleter #2 # def write_in(self): #3 1/2/3的名字必须一样。 # print(‘执行了删除函数‘) # self.f.close() #先关闭文件(还回去) # del self.f #再删除文件句柄 # b = Open(‘file.txt‘) # b.write_in # del b.write_in #触发了 @f.deleter #@classmethod #用类调用。 当类中的方法用不上self这个参数时,将self变成cls(类),在外面直接用 类.方法名 调用即可。 # class A: # @classmethod # def func(cls): # print(‘这个函数不需要self‘) # A.func() #@staticmethod #用类调用。当类中的方法即用不上cls也用不上self时。相当于把一个外埠的函数放入类中使用。 # class A: # @staticmethod # def login(name): # if name == ‘alex‘: # print(‘通过‘) # A.login(‘alex‘)
#封装 #私有静态属性:__静态属性 = ‘aaa‘ #只能在类内部使用,外面无法获取。 # class A: # __name = ‘wangxiaoer‘ # 等同于 _A__name = ‘wangxiaoer‘ # print(__name) #内部使用 # print(__name) #无法获取 #私有对象属性。 # class A: # def __init__(self,length): # self.__length = length #只在类内部用来计算或其它操作,一般用来外部不需要获取这个属性值的情况 # def cal(self): # return self.__length*2 # print(A(5).cal()) #私有方法: def __name(self): #1、某些方法不想让在外部被调用。比如:密码加密。 # 2、某些方法不需要在外部调用,没有用,没有意义。比如各个数据类型的内部操作方法。 # class A: # def __getpwd(self): # print(‘我是私有方法‘) # def login(self): #login是可以在外面被调用的,在外面调用登陆方法 # self.__getpwd() #然后执行登陆函数中的getpwd方法。(属于在内部执行) # A().login() # A().__getpwd() #出错 #私有方法面试题 # class Role: # def __init__(self): #子类中没有找到__init__方法,往父类中找。 # self.__func() #第三步,找到后往下执行。寻找__func方法,实则是查找_A__func方法 # def __func(self): #第五步,应该执行此函数(_A__func) # print(‘我是父类中的方法‘) # class Person(Role): #第二步,找到对应类,并找__init__方法。 # def __func(self): #第四步,先在自己类中找__func,发现是_B__func方法,不符合。 # print(‘我是子类中的方法‘) # Person() #第一步:实例化一个对象
#钻石继承(广度优先) # A # B(A) C(A) # D(B,C) 查找顺序:D--->B-->C-->A # class A: # def func(self): # print(‘in A‘) #4.A # class B(A): # def func(self): # print(‘in B‘) #2.B # super().func() # class C(A): #3.C # def func(self): # print(‘in C‘) # super().func() # class D(B,C): #广度优先原则,B找完再找C,不直接找A # def func(self): # print(‘in D‘) #1.D # super().func() # D().func() #第二种:(类似深度优先) # E F # B(E) C(F) # D(B,C) #查找顺序:D-->B-->E-->C-->F (类似深度优先,以路径最短为主。) # class E:pass # def func(self): # print(‘in E‘) # class F: # def func(self): # print(‘in F‘) # class B(E):pass # # def func(self): # # print(‘in B‘) #首先路线为D-->B-->E # # super().func() # class C(F): # def func(self): # print(‘in C‘) #如果B和E中都没有,则路线为D-->C-->F # super().func() # class D(B,C): # def func(self): # print(‘in D‘) # super().func() # D().func() #第三种 # A # E(A) F(A) # B(E) C(F) # D(B,C) 查找顺序:D-->B-->E-->C-->F-->A (找到E的时候不直接找A,因为还有另一条路线可以找到A) #查看查找顺序的方法:类名.mro() # print(D.mro()) #super()查找顺序与mro一致 #新式类:基于object的类,遵循广度优先原则。 #经典类:不基于object的类,遵循深度优先原则。 #py2中需要定义父类为object之后才能变成新式类。py3中默认最高层都是基于object的,所以全部都是新式类。
以上是关于py 5.28的主要内容,如果未能解决你的问题,请参考以下文章