面向对象编程
python中,万物皆对象,面向对象编程是一种程序设计的思想。对象作为程序的基本单元,一个对象包含了数据和操作数据的函数(即成员变量和成员函数)
面向对象最基本的概念是类和实例`
class Student():
'''
__init__(self)就是类初始化的一个构造函数;
对于类中定义的函数,其第一个参数永远是self,表示实例本身,
实例在调用函数时,不需要传递该参数;
'''
def __init__(self,name,id):
self.__name=name
self.__if=if
s1=Student("szs",123)
s2=Student("durant",35)
1 python中类的数据权限和表示:
- 私有成员变量:以两个单下划线_开头的变量,如__name;
- 在python中__xxx__ 前后都有两个单下环线的变量是特殊变量,特殊变量可以直接访问,不是私有的
- 以单个下划线开头的变量名,如_name,这种实例变量在外部是可以被访问的,但是一般按照约定,看到这种变量时,将其视为私有变量,不要随意访问;
双下划线开头的实例变量也不是一定不能在外部访问;原因是python解释器对外把__name变量改成了_Student__name,所以,在外部仍然可以通过_Student__name来访问__name变量;但是建议不要这么干,因为不同版本的python解释器可能会把__name改成不同的变量名。
因此当我们在外部使用__name变量名时,其并不代表该实例的__name私有变量名,而是在外部给实例新增了一个__name变量,改变量与实例的私有变量__name毫无关系
class Student():
def __init__(self,name,id):
self.__name=name
self.__id=id
def get_student(self):
print("name is",self.__name)
print("id is",self.__id)
s1=Student("szs",123)
s1.get_student()
s1.__name="durant"
s1.get_student() #self.__name并没有改变
2 python中的继承和多态
python中的多态实现
class Animal():
def __init__(self):
pass
def run(self):
print("animal is run")
class Cat(Animal):
def run(self):
print("cat is run")
class Othes():
def run(self):
print("i am run")
def run_2(animal):
animal.run()
run_2(Dog())
run_2(Cat())
run_2(Animal())
run_2(Othes())
注意: python里边的变量命名不需要指明数据类型,包括函数定义的入参
3 实例属性和类属性
由于python时动态语言,根据类创建的实例可以任意绑定属性。给实例绑定属性的方法是通过实例变量或者通过self变量来实现:
class Student(object):
def __init__(self,name):
self.name=name
s1=Student("SZS")
s1.score=90
如果Student类本身需要绑定一个属性呢?,可以直接在class中定于属性,这种属性是类属性,归Student类所有
>>> 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
因此,在编写程序的时候,千万不要对实例属性和类属性使用同名的名字,因为相同名称的实例属性将屏蔽掉类属性,但当你删除实例属性后,再使用相同的名称,访问到的是类属性;
4 super()函数
super()函数是用于调用父类的一个方法。
super用于解决多重继承问题,直接用类名调用父类的方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序、重复调用等种种问题。
无返回值
'''
python 3.x的语法 super().fun()
'''
class A:
def add(self,x):
y=x+1
print(y)
class B(A):
def add(self,x):
super().add(x)
b=B()
b.add(10) #11
'''
python2.x的语法
'''
super(B,self).add(x)