classAnimal:defrun(self):raise AttributeError('子类必须实现这个方法')classPeople(Animal):defrun(self):print('人正在走')classPig(Animal):defrun(self):print('pig is walking')classDog(Animal):defrun(self):print('dog is running')deffunc(animal):
animal.run()
func(Pig())# pig is walking
2.self是什么?
Python 的self相当于 C++ 的this指针
classTest:defprt(self):print(self)print(self.__class__)
t = Test()
t.prt()# <__main__.Test object at 0x000000BC5A351208># <class '__main__.Test'>
classBall:def__init__(self, name):
self.name = name
defkick(self):print("我叫%s,该死的,谁踢我..."% self.name)
a = Ball("球A")
b = Ball("球B")
c = Ball("球C")
a.kick()# 我叫球A,该死的,谁踢我...
b.kick()# 我叫球B,该死的,谁踢我...
# 类定义classpeople:# 定义基本属性
name =''
age =0# 定义私有属性,私有属性在类外部无法直接进行访问
__weight =0# 定义构造方法def__init__(self, n, a, w):
self.name = n
self.age = a
self.__weight = w
defspeak(self):print("%s 说: 我 %d 岁。"%(self.name, self.age))# 单继承示例classstudent(people):
grade =''def__init__(self, n, a, w, g):# 调用父类的构函
people.__init__(self, n, a, w)
self.grade = g
# 覆写父类的方法defspeak(self):print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name, self.age, self.grade))
s = student('小马的程序人生',10,60,3)
s.speak()# 小马的程序人生 说: 我 10 岁了,我在读 3 年级
如果上面的程序去掉:people.__init__(self, n, a, w),则输出:说: 我 0 岁了,我在读 3 年级,因为子类的构造方法把父类的构造方法覆盖了
import random
classFish:def__init__(self):
self.x = random.randint(0,10)
self.y = random.randint(0,10)defmove(self):
self.x -=1print("我的位置", self.x, self.y)classGoldFish(Fish):# 金鱼passclassCarp(Fish):# 鲤鱼passclassSalmon(Fish):# 三文鱼passclassShark(Fish):# 鲨鱼def__init__(self):
self.hungry =Truedefeat(self):if self.hungry:print("吃货的梦想就是天天有得吃!")
self.hungry =Falseelse:print("太撑了,吃不下了!")
self.hungry =True
g = GoldFish()
g.move()# 我的位置 9 4
s = Shark()
s.eat()# 吃货的梦想就是天天有得吃!
s.move()# AttributeError: 'Shark' object has no attribute 'x'
# 类定义classPeople:# 定义基本属性
name =''
age =0# 定义私有属性,私有属性在类外部无法直接进行访问
__weight =0# 定义构造方法def__init__(self, n, a, w):
self.name = n
self.age = a
self.__weight = w
defspeak(self):print("%s 说: 我 %d 岁。"%(self.name, self.age))# 单继承示例classStudent(People):
grade =''def__init__(self, n, a, w, g):# 调用父类的构函
People.__init__(self, n, a, w)
self.grade = g
# 覆写父类的方法defspeak(self):print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name, self.age, self.grade))# 另一个类,多重继承之前的准备classSpeaker:
topic =''
name =''def__init__(self, n, t):
self.name = n
self.topic = t
defspeak(self):print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name, self.topic))# 多重继承classSample01(Speaker, Student):
a =''def__init__(self, n, a, w, g, t):
Student.__init__(self, n, a, w, g)
Speaker.__init__(self, n, t)# 方法名同,默认调用的是在括号中排前地父类的方法
test = Sample01("Tim",25,80,4,"Python")
test.speak()# 我叫 Tim,我是一个演说家,我演讲的主题是 PythonclassSample02(Student, Speaker):
a =''def__init__(self, n, a, w, g, t):
Student.__init__(self, n, a, w, g)
Speaker.__init__(self, n, t)# 方法名同,默认调用的是在括号中排前地父类的方法
test = Sample02("Tim",25,80,4,"Python")
test.speak()# Tim 说: 我 25 岁了,我在读 4 年级
6.组合
classTurtle:def__init__(self, x):
self.num = x
classFish:def__init__(self, x):
self.num = x
classPool:def__init__(self, x, y):
self.turtle = Turtle(x)
self.fish = Fish(y)defprint_num(self):print("水池里面有乌龟%s只,小鱼%s条"%(self.turtle.num, self.fish.num))
p = Pool(2,3)
p.print_num()# 水池里面有乌龟2只,小鱼3条
7.类、类对象和实例对象
类对象:创建一个类,其实也是一个对象也在内存开辟了一块空间,称为类对象,类对象只有一个
classA(object):pass
实例对象:就是通过实例化类创建的对象,称为实例对象,实例对象可以有多个
classA(object):pass# 实例化对象 a、b、c都属于实例对象。
a = A()
b = A()
c = A()
classCoordinate:
x =10
y =-5
z =0
point1 = Coordinate()print(hasattr(point1,'x'))# Trueprint(hasattr(point1,'y'))# Trueprint(hasattr(point1,'z'))# Trueprint(hasattr(point1,'no'))# False
getattr(object, name[, default])用于返回一个对象属性值
classA(object):
bar =1
a = A()print(getattr(a,'bar'))# 1print(getattr(a,'bar2',3))# 3print(getattr(a,'bar2'))# AttributeError: 'A' object has no attribute 'bar2'
这个例子很酷
classA(object):defset(self, a, b):
x = a
a = b
b = x
print(a, b)
a = A()
c =getattr(a,'set')
c(a='1', b='2')# 2 1
classA(object):
bar =1
a = A()print(getattr(a,'bar'))# 1setattr(a,'bar',5)print(a.bar)# 5setattr(a,"age",28)print(a.age)# 28
delattr(object, name)用于删除属性
classCoordinate:
x =10
y =-5
z =0
point1 = Coordinate()print('x = ', point1.x)# x = 10print('y = ', point1.y)# y = -5print('z = ', point1.z)# z = 0delattr(Coordinate,'z')print('--删除 z 属性后--')# --删除 z 属性后--print('x = ', point1.x)# x = 10print('y = ', point1.y)# y = -5# 触发错误print('z = ', point1.z)# AttributeError: 'Coordinate' object has no attribute 'z'