本文标识 : Python_11
本文编辑 : Jack 风
编程工具 : Anaconda、Pycharm
阅读时长 : 6分钟
如果有一个对象,当需要对其进行修改属性时,有两种方法
为了更好的保存属性安全,即不能随意修改,一般的处理方式为
私有共有属性区分
它是以属性命名方式来区分,如果在属性名前面加了2个下划线'__',则表明该属性是私有属性,否则为公有属性(方法也是一样,方法名前面加了2个下划线的话表示该方法是私有的,否则为公有的)。
_del_()
方法在程序中,继承描述的是事物之间的所属关系,例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物;同理,波斯猫和巴厘猫都继承自猫,而沙皮狗和斑点狗都继承自狗,如下如所示:
说明:
__init__
方法,但是父类有,所以在子类继承父类的时候这个方法就被继承了,所以只要创建Bosi的对象,就默认执行了那个继承过来的__init__
方法总结
所谓多继承,即子类有多个父类,并且具有他们的特征
注意点
想一想: 如果在上面的多继承例子中,如果父类A和父类B中,有一个同名的方法,那么通过子类去调用的时候,调用哪个?
所谓重写,就是子类中,有一个和父类相同名字的方法,在子类中的方法会覆盖掉父类中同名的方法
其实多态的概念,一般应用于Java这类强类型语言中, 而Python崇尚“鸭子类型” 所谓多态:定义时的类型和运行时的类型不一样,此时就成为多态
鸭子类型
class People(object):
name = 'A2Data' #公有的类属性
__age = 22 #私有的类属性
p = People()
print(p.name) #正确
print(People.name) #正确
print(p.__age) #错误,不能在类外通过实例对象访问私有的类属性
print(People.__age) #错误,不能在类外通过类对象访问私有的类属性
class People(object):
address = '北京' #类属性
def __init__(self):
self.name = 'A2Data' #实例属性
self.age = 22 #实例属性
p = People()
p.age =18 #实例属性
print(p.address) #正确
print(p.name) #正确
print(p.age) #正确
print(People.address) #正确
print(People.name) #错误
print(People.age) #错误
通过实例(对象)去修改类属性
class People(object):
country = 'china' #类属性
print(People.country)
p = People()
print(p.country)
p.country = 'japan'
print(p.country) #实例属性会屏蔽掉同名的类属性
print(People.country)
del p.country #删除实例属性
print(p.country)
归纳 如果需要在类外修改
类属性
,必须通过类对象
去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性
,这种方式修改的是实例属性
,不会影响到类属性
,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性
,除非删除了该实例属性
。
类对象所拥有的方法,需要用修饰器
@classmethod
来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls
作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以'cls'作为第一个参数的名字,就最好用'cls'了),能够通过实例对象和类对象去访问。
用类方法对类属性修改之后,通过类对象和实例对象访问都发生了改变
需要通过修饰器
@staticmethod
来进行修饰,静态方法不需要多定义参数