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
相关文章
最新推荐