一个类的对象是另一个类对象的属性
两个类之间 有什么什么的关系 :班级有学生 学生有班级 班级有课程 图书有作者 学生有成绩)
学生 课程
班级 课程
圆形 圆环
圆形 圆锥 圆柱
当你改的多的时候, 运用分组比较方便
? 在类的命名空间里 :静态变量, 绑定方法
? 在对象命名空间里:类指针,对象的属性(实例属性)
类名:静态变量
对象: 静态变量(对象调用静态变量时候,不能对变量赋值操作, 只能查看 不能 向后面的一样 对象.静态变量‘=‘)
绑定方法
# 猫
# 吃
# 喝
# 睡
# 爬树
# 狗
#
# 吃
# 喝
# 睡
# 看家
#
# 继承 --需要解决代码重复的
# 继承语法
#
# class A:
# pass
# class B:
# pass
#
# B继承A A是父类 B是子类
# A是父类 基类 超类
# B是 子类 派生类
B继承A A是父类 B是子类
A是父类 基类 超类
B是 子类 派生类
子类可以用
父类和子类的方法选择:
? 子类的对象 如果去调用方法
? 永远优先调用自己的
? 如果自己有 用自己的
? 自己没有 用父类的
? 如果自己有 还想用父类的 直接在子类方法中 调父类 的方法 ,
? 父类名.方法名
class Animal:
def __init__(self,name,food):
# def __init__(self,name):
self.name=name
self.food=food
self.blood=100
self.waise=100
def eat(self):
# print(f'{self.name} is eating')
print(f'{self.name} is eating {self.food}')
def drink(self):
print(f'{self.name} is drinking')
def sleep(self):
print(f'{self.name} is sleep')
class Cat(Animal):
def clime_tree(self):
print(f'{self.name} is climbing')
def eat(self):
self.blood+=100
Animal.eat(self)
class Dog(Animal):
def eat(self):
self.waise+=100
Animal.eat(self)
def house_keep(self):
print(f'{self.name} is keeping')
小白=Cat('小白','猫粮')
小黑=Dog("小黑",'狗粮')
小白.eat()
小黑.eat()
print(小白.__dict__)
print(小黑.__dict__)
#
# 小白 is eating 猫粮
# 小黑 is eating 狗粮
# {'name': '小白', 'food': '猫粮', 'blood': 200, 'waise': 100}
# {'name': '小黑', 'food': '狗粮', 'blood': 100, 'waise': 200}
特殊属性
# 小猫 小狗有特殊的属性
class Animal:
def __init__(self,name,food):
# def __init__(self,name):
self.name=name
self.food=food
self.blood=100
self.waise=100
def eat(self):
# print(f'{self.name} is eating')
print(f'{self.name} is eating {self.food}')
def drink(self):
print(f'{self.name} is drinking')
def sleep(self):
print(f'{self.name} is sleep')
class Cat(Animal):
def __init__(self,name,food,eyes):
Animal.__init__(self,name,food) #调用弗雷德方法三 ,去完成一些通用属性的初始化
self.eyes=eyes #派生属性
def clime_tree(self):
print(f'{self.name} is climbing')
def eat(self):
self.blood+=100
Animal.eat(self)
class Dog(Animal):
def eat(self):
self.waise+=100
Animal.eat(self)
def house_keep(self):
print(f'{self.name} is keeping')
小白=Cat('小白','猫粮','蓝色')
小黑=Cat('小白','猫粮','三只眼睛')
print(小黑.__dict__)
print(小白.__dict__)
# {'name': '小白', 'food': '猫粮', 'blood': 100, 'waise': 100, 'eyes': '三只眼睛'}
# {'name': '小白',
# 单继承 不管有几个儿子 都是单继承
class D:
def func(self):
print("in D")
class A(D):pass
class B(A):
def func(self):
print('in B')
class C(B):pass
C().func()
# in B
class D:
def func(self):
print("in D")
class A(D):pass
class B(A):pass
class C(B):pass
C().func()
# in D
# # 多继承 有好几个爹
#
# 有些语言不支持多继承 java
# python语言特点 可以在面向对象中支持多继承
class B:
def funv(self):print('IN B ')
class A:
def funv(self):print('IN A ')
class C(A,B): # 谁在前 就执行谁 A 在前
pass
C().funv()
# IN A
class C(B,A): # 谁在前 就执行谁 B在前
pass
C().funv()
# IN B
#
# bases 只显示父类 不显示更上一级的类
class A :pass
print(A.__bases__)
# (<class 'object'>,)
class C :pass
class B(A,C) :pass
print(B.__bases__)
#
# (<class '__main__.A'>, <class '__main__.C'>)
类的补充
二:特殊的类属性
类名.__name__# 类的名字(字符串)
类名.__doc__# 类的文档字符串
类名.__base__# 类的第一个父类(在讲继承时会讲)
类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
类名.__dict__# 类的字典属性
类名.__module__# 类定义所在的模块
类名.__class__# 实例对应的类(仅新式类中)
# 所有在python3中的类都是继承 object类
#
# object 中有 init
# 所有类都默认继承object
class A :
pass #即便什么都不写 也不会报错
# 等于
# class A (object): # 规范写法
# pass
a=A()
a=A()
# 开空间,调用init
# bases 只显示父类 不显示更上一级的类
class A :pass
print(A.__bases__)
# (<class 'object'>,)
class C :pass
class B(A,C) :pass
print(B.__bases__)
#
# (<class '__main__.A'>, <class '__main__.C'>)
原文:https://www.cnblogs.com/xueba/p/12466691.html