一:封装
1.内置的三种方法:
# 1.三种内置函数
class Cat:
def __init__(self,new_name):# 类中的变量进行初始化
self.name = new_name
print("%s 来了"% self.name)
def __del__(self): # 在类的对象销毁前,调用的方法
print("%s 去了"% self.name)
def __str__(self): # 在print()是要打印的信息,而不再是打印地址
return "我是小猫:%s"% self.name
tom = Cat("Tom") # 自动调用了init方法
print(tom) # 先调用str方法,执行完再执行del方法。
运行结果:
Tom 来了
我是小猫:Tom
Tom 去了
封装案例:小明 小妹爱跑步
# 封装案例:小明爱跑步
class Person:
def __init__(self,name,weight):
self.name = name
self.weight = weight
def __str__(self):
return "我的名字是 %s 体重是 %.2f 公斤" % (self.name,self.weight)
def run(self):
print("%s 爱跑步 " % self.name)
self.weight -= 0.5
def eat(self):
print("%s 是吃货 "% self.name)
self.weight += 1
xiaoming = Person("小明",75.0)
xiaoming.run()
xiaoming.eat()
print(xiaoming)
xiaomei = Person("小妹",45)
xiaomei.eat()
xiaomei.run()
print(xiaomei)
print(xiaoming) # 互相不影响
# :结论 同一个类创建的多个对象之间是互不干扰的
运行过程
小明 爱跑步
小明 是吃货
我的名字是 小明 体重是 75.50 公斤
小妹 是吃货
小妹 爱跑步
我的名字是 小妹 体重是 45.50 公斤
我的名字是 小明 体重是 75.50 公斤
二: 继承
class Animal:
def eat(self):
print("吃")
def drink(self):
print("喝")
def run(self):
print("跑")
def sleep(self):
print("睡")
wangcai1 = Animal()
wangcai1.run()
wangcai1.eat()
wangcai1.drink()
wangcai1.sleep()
class Dog (Animal): #class 类名(父类名): 子类继承父类的所有的方法。
def bark(self):
print("汪汪叫")
wangcai2 = Dog()
wangcai2.bark()
wangcai2.sleep()
# class Xiaotianquan(Dog):
# def fly(self):
# print("哈哈,我会飞")
# class Cat(Animal):
# def catch(self):
# print("我会抓老鼠")
#
# xtq = Xiaotianquan()
# xtq.fly()
# xtq.bark()
# xtq.eat()
# 子类重写父类的方法:定义同名方法即可。
# 让哮天犬叫的特殊
# class XiaoTianQuan(Dog):
# def bark(self):
# print("嗷呜,嗷呜")
#
# xtq = XiaoTianQuan()
# xtq.bark() # 此时输出嗷呜,嗷呜
# 对父类的方法进行重写
# 子类方法的实现 中包含父类方法的实现
# 过程 1.子类重写父类的方法
# 2.在使用的地方使用 super().父类方法 关键字调用父类的方法执行。
# 3.代码其他位置针对子类的需求,编写子类特有的代码实现
class XiaoTianQuan(Dog):
def fly(self):
print("哈哈,我会飞")
def bark(self):
# 1.针对子类的特性编写自己的代码。
print("嗷呜 嗷呜")
# 2.使用super() 来调用原来父类的方法
super().bark()
# 3.增加其他子类的代码
print("XWXDWDSW")
xtq = XiaoTianQuan()
xtq.bark() # 输出嗷呜 嗷呜 汪汪叫 XWXDWDSW
父类的私有属性和私有方法:
class A ():
def __init__(self):
self.num1 = 100
self.__num2 = 200 # 私有属性前有两个下划线
def __test(self):
print("私有方法 %d %d "% (self.num1,self.__num2))
def test(self):
print("我是共有方法")
class B(A):
def demo(self):
# 1.访问父类的私有属性
# print("访问父类的私有属性 %d" % self.__num2) # 运行报错
print("不能调用")
# 2.调用父类的私有方法
# self.__test()报错
b = B()
print(b)
b.demo()
print(b.test())
多继承:
class A:
def test(self):
print("test 方法")
class B:
def demo(self):
print("demo 方法")
class C(A,B):
pass
c = C()
c.test() # 输出test 方法
c.demo() # 输出demo 方法
多继承的注意事项:
假设A B存在同名的方法?
class B:
def test(self):
print("B----test 方法")
def demo(self):
print("B----demo 方法")
class C(A,B):
pass
c = C()
c.test() # 输出test 方法
c.demo() # 输出demo 方法
输出:
A----test 方法
A----demo 方法
若修改成
class C(B,A):
B----test 方法
B----demo 方法
python 的MRO(方法搜索顺序):
print(C.mro())
[<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
先搜索C ,再搜索B 再搜索A 最后搜索Object
三 :多肽
让不同的子类对象调用相同的方法产生不同的结果:多肽。
class Dog(object):
def __init__(self,name):
self.name = name
def game(self):
print("%s 蹦蹦跳跳的玩耍" % self.name)
class XiaoTianQuan(Dog):
def game(self):
print("%s 飞上天和太阳肩并肩" % self.name)
class Person(object):
def __init__(self,name):
self.name = name
def game_with_dog(self,dog):
print("%s 和 %s 快乐的玩耍" % (self.name ,dog.name))
dog.game()
# 1.创建一个狗对象
#wangcai = Dog("旺财")
wangcai = XiaoTianQuan("飞天旺财")
# 2.创建一个小明对象
xiaoming = Person("小明")
# 3.让小明调用和狗玩的方法
xiaoming.game_with_dog(wangcai)
运行结果:
小明 和 飞天旺财 快乐的玩耍
飞天旺财 飞上天和太阳肩并肩