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