Python 新式类和经典类区别及类特性
Admin
2019-10-25 16:00:15
Python
1、新式类和经典类对比
声明方式, Python3.x取消了经典类,默认都是新式类,并且不必显式的继承object(写法上不在乎加不加)
class A: # 经典类 def __init__(self): pass class B(object): # 新式类 def __init__(self): pass # 新式类声明的时候需要继承内置object对象(或者内置类型如,list、dict等),我们使用dir()函数也 可以看出新式类中定义看很多的属性和方法 >>> dir(A) ['__doc__', '__init__', '__module__'] >>> dir(B) ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
搜索方式, 经典类是以深度优先, 新式类是以广度优先
# 经典类 class A: def __init__(self): pass def save(self): print("this is A") class B(A): def __init__(self): pass class C(A): def __init__(self): pass def save(self): print("this is C") class D(B, C): def __init__(self): pass >>> s = D() >>> s.save() this is A # 新式类 class A(object): def __init__(self): pass def save(self): print("this is A") class B(A): def __init__(self): pass class C(A): def __init__(self): pass def save(self): print("this is C") class D(B, C): def __init__(self): pass >>> s = D() >>> s.save() this is C
2、 类特性
attribute特性, 对象内部的变量及状态由它描述,且对象的方法可以改变特性,也可从对象外部直接访问。
class A: name = "ywfuns" # 类中的特性 def get_name(self): # 通过访问器方式特性 return self.name def set_name(self, value): # 通过访问器改变特性 self.name = value >>> s = A() >>> s.name 'ywfuns' >>> s.name = "www.ywfuns.com" >>> s.name 'www.ywfuns.com' >>>
类中私有化
class A: __name = "ywfuns" # 加上双下划线私有化 def get_name(self): # 通过访问器方式特性 return self.__name def set_name(self, value): # 通过访问器改变特性 self.__name = value >>> s = A() >>> s.__name # 无法访问 >>> s.get_name() 'ywfuns' >>> s.set_name(" # 还是可以访问的,本质上并不完全支持私有化 >>> s.get_name() 'www.ywfuns.com'
property属性,对特性进行访问和设置
# 第一种方法使用属性 class A: def __init__(self): self.name = 'ywfuns' self.work = 'master' def get_person(self): return self.name,self.work def set_person(self,value): self.name,self.work = value person = property(get_person,set_person) >>> s = A() >>> s.person ('ywfuns', 'master') >>> s.person = 'bb','cc' >>> s.person ('bb','cc') # 第二种方法使用属性 class A: def __init__(self): self.name = 'ywfuns' self.work = 'master' @property def person(self): return self.name,self.work # 如果不指定stter属性,那么无法从类的外部对它的值进行设置,这对于只读特性非常有用 @person.setter def person(self,value): self.name,self.work = value