当前位置: 移动技术网 > IT编程>脚本编程>Python > python面向对象编程

python面向对象编程

2018年04月21日  | 移动技术网IT编程  | 我要评论

济公传郭德纲,金盾保镖,880009

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网