14)面向对象
https://www.runoob.com/python3/python3-class.html
https://www.liaoxuefeng.com/wiki/1016959663602400/1017497232674368
1. 类和实例
注:它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。
self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。
self 不是 python 关键字,换成其他也可以运行
例如
In [1]: class Student: ...: def __init__(lotus, name): ...: lotus.name = name ...: def prt(lotus): ...: print(lotus.name) ...: In [2]: x = Student(‘snks‘) In [3]: x.prt() snks
类属性
>>> 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
注:在编写程序的时候,千万不要对实例属性和类属性使用相同的名字,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。
在类内部调用类的属性时需要加上类的名字
例如:
为了统计学生人数,可以给Student类增加一个类属性,每创建一个实例,该属性自动增加
class Student(object): count = 0 def __init__(self, name): self.name = name Student.count = Student.count + 1
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。
self 的名字并不是规定死的,也可以使用 this,但是最好还是按照约定是用 self。
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods。
2. 访问限制
class people: # 定义基本属性 name = ‘‘ age = 0 # 定义私有属性,私有属性在类外部无法直接进行访问 __weight = 0 # 定义构造方法 def __init__(self, n, a, w): self.name = n self.age = a self.__weight = w def speak(self): print("%s 说: 我 %d 岁,超级无敌重:%d" % (self.name, self.age, self.__weight)) # 实例化类 p = people(‘runoob‘, 10, 30) print(p.__weight) ##结果raise AttributeError p.speak()
可以写专门的函数进行获取,如:
def get_weight(self): return self.__weight
##修改: def set_weight(self, w): if w >=0 and w <= 500: self.__weight = w else: print(‘恭喜您的体重达到 %d 无人能及‘ % w)
注意注意:在Python中,变量名类似__xxx__
的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__
、__score__
这样的变量名。
错误写法
>>> bart = Student(‘Bart Simpson‘, 59) >>> bart.get_name() ‘Bart Simpson‘ >>> bart.__name = ‘New Name‘ # 设置__name变量! >>> bart.__name ‘New Name‘
表面上看,外部代码“成功”地设置了__name
变量,但实际上这个__name
变量和class内部的__name
变量不是一个变量!内部的__name
变量已经被Python解释器自动改成了_Student__name
,而外部代码给bart
新增了一个__name
变量:
>>> bart.get_name() # get_name()内部返回self.__name ‘Bart Simpson‘
3.继承
例子1:
#类定义 class people: #定义基本属性 name = ‘‘ age = 0 #定义私有属性,私有属性在类外部无法直接进行访问 __weight = 0 #定义构造方法 def __init__(self,n,a,w): self.name = n self.age = a self.__weight = w def speak(self): print("%s 说: 我 %d 岁。" %(self.name,self.age)) #单继承示例 class student(people): grade = ‘‘ def __init__(self,n,a,w,g): #调用父类的构函 people.__init__(self,n,a,w) self.grade = g #覆写父类的方法 def speak(self): print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade)) s = student(‘ken‘,10,60,3) s.speak()
##执行以上程序输出结果为: ken 说: 我 10 岁了,我在读 3 年级
例子2:
class Animal(object): def run(self): print(‘Animal is running...‘) class Dog(Animal): def run(self): print(‘Dog is running...‘) class Cat(Animal): def run(self): print(‘Cat is running...‘)
注意产生变量的类型以及多态:
多继承
4.方法重写
原文:https://www.cnblogs.com/shish/p/12258989.html