python's ninteenth day for me 类的组合,继承。
组合:
表示一个类的对象作为另一个类对象的属性。
实例化的过程:
1,创建一个对象。
2,__init__ 给对象添加一些属性,对象默认的名字为self。
3,将self所指向的内存空间返回给实例化他的地方。
使用这个对象可以找到两个东西:
1,对象所在的内存中存储的属性。
2,类对象指针所指的类中的所有方法和静态属性。
对象找名字的时候:先找自己内存空间中的,再找类的。
对象没有权利修改类中的静态变量和方法。
用类名操作静态变量(属性)。
类名:实例化对象,调用静态属性,执行方法。
交互:对象可以作为参数传递给类中的方法。
组合:对象可以作为一个对象的属性。
为什么会用组合:独立的对象不能发挥他的作用,必须依赖一个对象。
class Person:
def __init__(self,name,sex,hp,ad):
self.name = name
self.sex = sex
self.hp = hp
self.ad = ad
self.money = 0
def attack(self,dog):
dog.hp -= self.ad
print('%s攻击了%s,%s掉了%s点血' % (self.name,dog.name,dog.name,self.ad))
def pay(self):
money = int(input('请输入你要充值的金额:'))
self.money += money
print('你的余额为:%s' % self.money)
def wear(self,weapon): # 装备武器
if self.money >= weapon.price:
self.weapon = weapon # 组合 给人装备了武器 武器类的对象作为了人类对象的一个属性。
self.money -= weapon.price
print('购买成功,你已经顺利装备了%s' % weapon.name)
else:
print('余额不足,请充值...')
def attack_with_weapon(self,dog):
if 'weapon' in self.__dict__:
self.weapon.skill(dog)
else:
print('请先装备武器...')
class Dog:
def __init__(self,name,kind,hp,ad):
self.name = name
self.kind = kind
self.hp = hp
self.ad = ad
def bite(self,person):
person.hp -= self.ad
print('%s咬了%s,%s掉了%s点血' % (self.name,person.name,person.name,self.ad))
class Weapon:
def __init__(self,name,price,ad,level):
self.name = name
self.price = price
self.ad = ad * level
self.level = level def skill(self,dog):
dog.hp -= self.ad
print('%s受到了%s的伤害,%s掉了%s点血' % (dog.name,self.name,dog.name,self.ad)) alex = Person('a_sb','不详',1,5)
boss_jin = Person('金老板','女',20,50)
teddy = Dog('笨笨','teddy',150,50)
futou = Weapon('斧头',1000,100,1) # alex.weapon.skill()
# print(alex.weapon)
# print(futou)
# futou.skill(teddy)
lis = ['攻击','充值','装备武器','使用武器']
while True:
for index,value in enumerate(lis,1):
print(index,value)
choice = int(input('请输入你的选择:'))
if choice == 1:
alex.attack(teddy)
elif choice == 2:
alex.pay()
elif choice == 3:
alex.wear(futou)
elif choice == 4:
alex.weapon.skill(teddy)
else:
print('无效序号:')
组合的实例:
# 圆形类
# 写一个圆环类 组合 圆形类 去完成 计算圆环的面积和周长
# 一个类的对象作为另一个类对象的属性
# 圆环中有圆 # 圆形类 : 计算圆形面积 和 周长
# 圆环类 :
# 圆环的周长 : 大圆周长加小圆周长
# 圆环的面积 : 大圆的面积 - 小圆的面积
from math import pi
class Circle:
def __init__(self,r):
self.r = r
def cir_area(self):
return pi*self.r**2
def cir_perimeter(self):
return pi*self.r*2 class Ring:
def __init__(self,max_r,min_r):
self.max_r = Circle(max_r) # 相当于实例化。self.max_r是Circle类中的一个对象。它又是Ring类中的对象的属性。
self.min_r = Circle(min_r)
def R_area(self):
return self.max_r.cir_area() - self.min_r.cir_area()
def R_perimeter(self):
return self.max_r.cir_perimeter() + self.min_r.cir_perimeter() r1 = Ring(3,2)
print(r1.R_area())
print(r1.R_perimeter())
班级和老师的关系(组合):
# 老师
# 姓名 年龄 性别 班级 : s11 # 班级
# 班级名 班级人数 科目 性质 class Teacher:
def __init__(self,name,age,sex,cla):
self.name = name
self.age = age
self.sex = sex
self.cla = cla class Cla:
def __init__(self,name,num,course,type):
self.name = name
self.num = num
self.course = course
self.type = type
cla = Cla('s11',99,'python','全栈')
teacher = Teacher('Eva',18,'女',cla) print(teacher.cla.name)
print(teacher.cla.num)
print(teacher.cla.course)
print(teacher.cla.type)
初识继承:
单继承:
在python3中,所有类都会默认继承object类。
继承了object类的所有类都是新式类。
如果一个类没有继承任何父类,那么__bases__属性就会显示 <class 'object'>
class Parent:
pass
class Son(Parent): # 继承关系
pass
print(Son.__bases__) # 内置的属性
print(Parent.__bases__)
# (<class '__main__.Parent'>,)
# (<class 'object'>,)
多继承:
class Parent1:
pass
class Parent2(Parent1):
pass
class Parent3:
pass
class Son(Parent2,Parent3):
pass print(Parent1.__bases__) # (<class 'object'>,)
print(Parent2.__bases__) # (<class '__main__.Parent1'>,)
print(Parent3.__bases__) # (<class 'object'>,)
print(Son.__bases__) # (<class '__main__.Parent2'>, <class '__main__.Parent3'>)
父类:基类,超类。
字类:派生类
class Animal:
role = 'Animal'
def __init__(self,name,hp,ad):
self.name = name
self.hp = hp
self.ad = ad def eat(self):
print('%s吃药回血了' % (self.name)) class Person(Animal):
r = 'Person'
def attack(self,dog):
print('%s攻击了%s' % (self.name,dog.name)) class Dog(Animal):
def bite(self,person):
print('%s咬了%s' % (self.name,person.name)) alex = Person('a_sb',10,5) # 继承了父类中的属性。
dog = Dog('teddy',100,20) # 继承了父类中的属性。 # 继承中的派生方法。
alex.attack(dog)
dog.bite(alex) # 继承父类的方法,前提自己没有同名方法,否则无法继承。
dog.eat() # 继承了父类中的 方法。
self.名字 的时候,不要看self当前在哪个位置,要看这个self到底是谁的对象。
class Parent:
def func(self):
print('in Parent func')
def __init__(self):
self.func() class Son(Parent):
def func(self):
print('in Son func') s = Son() # in Son func

面向对象的思想:
1,不关心程序执行的过程。
2,关心的是一个程序中的角色 以及 角色与角色之间的关系。
python's ninteenth day for me 类的组合,继承。的更多相关文章
- 24 类:组合 继承 super关键字 面向对象的三大性
组合 组合:自定义类的对象作为另外一个类的属性 class Teacher: def __init__(self, name, age): self.name = name self.age = ag ...
- python学习道路(day8note)(抽象类,类的方法,异常处理,socket编程)
1.#面向对象 #抽象接口 === 抽象类 #就是架构师给你一个架子,你们去写,如果满足不了直接报错 #python2 print("python2---抽象类".center(2 ...
- 【python进阶】详解元类及其应用2
前言 在上一篇文章[python进阶]详解元类及其应用1中,我们提到了关于元类的一些前置知识,介绍了类对象,动态创建类,使用type创建类,这一节我们将继续接着上文来讲~~~ 5.使⽤type创建带有 ...
- Python学习第十五篇——类继承和类实例化
学习Python类时,我们明白了类的本质,以及所谓的面向对象编程思想强调的对事物本身的属性,我们对某一类事物进行描述——采用了很多方法,这些方法描述了类的属性(比如猫科动物的眼睛,四肢,是否哺乳类等等 ...
- python类的组合
类的组合,即在类实例化时,将另一个类的实例作为参数传入,这样可以将两个实例关联起来. 当类之间有显著不同,并且较小的类是较大的类所需要的组件时,用组合比较好. 例如,描述一个机器人类,这个大类是由很多 ...
- Python类方法、静态方法与实例方法 -----类里面不需要实例化参数 和没带self的函数 调用此函数的方法
来源: https://www.cnblogs.com/blackmatrix/p/5606364.html 静态方法是指类中无需实例参与即可调用的方法(不需要self参数),在调用过程中,无需将类实 ...
- Python 类的多继承
#类的多继承 ''' 与c++不同,python的类经过优化,多继承时不会产生方法二义性 ''' #python中所有的类都是默认继承于object类 class A(object): def tes ...
- 7 python 类的组合
1.组合与重用性 软件重用的重要方式除了继承之外还有另外一种方式,即:组合 组合指的是,在一个类中以另外一个类的对象作为 1.一个类的属性可以是一个类对象,通常情况下在一个类里面很少定义一个对象就是它 ...
- python语法学习之函数、类、模块
Python中通过使用类(class)和对象(object)来实现面向对象(object-oriented programming,简称OOP)的编程. 面向对象编程的最主要目的是提高程序的重复使用性 ...
随机推荐
- 新版appium绘制九宫格的一个注意点
在用appium-desktop-setup-1.6.2进行app手势密码设置时,发现move_to(x, y)相对偏移量的方法用不了,绘制的手势也是乱跑 还会抛一个错误 selenium.commo ...
- idea常用插件
1. 装逼插件 1.1 activate-power-mode 其设置在菜单栏window——active-power-mode下设置颜色是否显示,窗口是否晃动等等 1.2 Backgrou ...
- mongodb底层存储和索引原理——本质是文档数据库,无表设计,同时wiredTiger存储引擎支持文档级别的锁,MMAPv1引擎基于mmap,二级索引(二级是文档的存储位置信息『文件id + 文件内offset 』)
MongoDB是面向文档的数据库管理系统DBMS(显然mongodb不是oracle那样的RDBMS,而仅仅是DBMS). 想想一下MySQL中没有任何关系型数据库的表,而由JSON类型的对象组成数据 ...
- java中商业数据计算时用到的类BigDecimal和DecimalFormat
1.引言 借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确 ...
- MASM 16位汇编程序几种典型的格式
1.有名段 data segment output db 'Hello world!$' data ends code segment start: assume ds:data,cs:code mo ...
- PostBack IsPostBack
这涉及到aspx的页面回传机制的基础知识 postback是回传 即页面在首次加载后向服务器提交数据,然后服务器把处理好的数据传递到客户端并显示出来,就叫postback, ispostback只是一 ...
- JSP的三大指令
三大指令:page指令.include指令和taglib指令. page指令: * import:等同与import语句 <%@ page import="java.util.*& ...
- 首次尝试LINUX下的ssh命令:登录和退出
1:我现在本机安装了centos虚拟机,然后在windows桌面下使用SecureCRT ssh客户端登录我的本地虚拟机,再然后 通过centos下的ssh命令登录局域网内测试机192.168.0.1 ...
- not
x = [] print(x) print(not x) print(x is None) print(not x is None) print(x is not None)
- WCF OpenTimeout, CloseTimeout, SendTimeout, ReceiveTimeout
1.OpenTimeout 客户端与服务端建立连接时,如果超过指定时间都还没完成,就引发TimeoutException. 在TCP通讯中,服务器必须首先准备好侦听端口并在该端口上侦听(Listen) ...

