欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python面向对象编程

程序员文章站 2022-11-09 09:04:48
python面向对象编程。 1.如何将变量私有化 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线,在Python中,实例的变量名如果以开头,就变成了一个私有变量...

python面向对象编程

1.如何将变量私有化

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线,在Python中,实例的变量名如果以开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。

注意:在Python中,变量名类似xxx的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用name、score这样的变量名。

注意:双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量.

最后注意下面的这种错误写法:

bart = Student(‘Bart Simpson’, 98)

bart.get_name()

‘Bart Simpson’

bart.__name = ‘New Name’ # 设置__name变量!

bart.__name

‘New Name’

表面上看,外部代码“成功”地设置了__name变量,但实际上这个__name变量和class内部的__name变量不是一个变量!内部的__name变量已经被Python解释器自动改成了_Student__name,而外部代码给bart新增了一个__name变量。

2.继承和多态

对于一个变量,我们只需要知道它是Animal类型,无需确切地知道它的子类型,就可以放心地调用run()方法,而具体调用的run()方法是作用在Animal、Dog、Cat还是Tortoise对象上,由运行时该对象的确切类型决定,这就是多态真正的威力:调用方只管调用,不管细节,而当我们新增一种Animal的子类时,只要确保run()方法编写正确,不用管原来的代码是如何调用的。这就是著名的“开闭”原则:

对扩展开放:允许新增Animal子类;

对修改封闭:不需要修改依赖Animal类型的run_twice()等函数。

对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法。对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了.

3.获取对象信息

isinstance()判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上。

并且还可以判断一个变量是否是某些类型中的一种,比如下面的代码就可以判断是否是list或者tuple:

>>> isinstance([1, 2, 3], (list, tuple))

True

如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list.

4.实例属性和类属性

从上面的例子可以看出,在编写程序的时候,千万不要把实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。

>>> class Student(object):

… name = ‘Student’

s = Student() # 创建实例s

print(s.name) # 打印name属性,因为实例并没有name属性,所以会继续查找class的name属性

Student

print(Student.name) # 打印类的name属性

Student

s.name = ‘Michael’ # 给实例绑定name属性

print(s.name) # 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的name属性

Michael

print(Student.name) # 但是类属性并未消失,用Student.name仍然可以访问

Student

del s.name # 如果删除实例的name属性

print(s.name) # 再次调用s.name,由于实例的name属性没有找到,类的name属性就显示出来了

Student