day23:类的命名空间和组合
1,类属性:静态属性,方法:动态属性;双下init方法,每当我们调用类的时候就会自动的触发这个方法,默认传self,在init方法里面可以对self赋值;在类的内部,self就是一个对象,我们自己实例化的对象是类外部的对象
2,Python入门,给你一个需求,能翻译成Python语言,就入门了;面向对象入门,当你见到一个需求,能分析出这个问题是否适合用面向对象解决,如果适合,能有一些想法,怎么设计这个类,有几个属性,方法等等
3,一定要选好最适合的编程方式,不是所有的都适合用面向对象来解决的,面向对象只是一种编程思想,并没有高端低端之分。
4,是否可以用对象名来调用静态属性呢?可以的
5,类中的函数名和对象,最终都是一个名字而已,都是一个内存地址。定义了一个类以后,会创建一个这个类名的命名空间,在这个空间内,放名字
6,有了对象一定可以找到类(类对象指针),有了类找不到对象,单线联系,对象自己的空间里面没有的时候,回去类的空间里面找
class Course:
language = 'Chinese'
def __init__(self,teacher,course_name,period,price):
self.teacher = teacher
self.name = course_name
self.period = period
self.price = price
def func(self):
pass
linux = Course('lisa','linux',6,20000)
linux.language = "japanese" # 这个是给对象新添加了一个属性
print(linux.__dict__)
del linux.language #删除这个属性
Course.language = 'English' # 这个是修改了雷属性
print(Course.__dict__)
# {'teacher': 'lisa', 'name': 'linux', 'period': 6, 'price': 20000, 'language': 'japanese'}
# {'__module__': '__main__', 'lan
7,对于静态属性不可变数据类型来说,类变量最后用类名来操作,用对象来操作的话,只不过给对象添加了新的属性;对于可变数据类型,可以用对象和类的索引来操作
8,绑定方法,这个对象提供的所有的数据,这个方法都可以去调用了,这种情况下,才产生了绑定方法。绑定的意思其实就是把这个对象当做self传进去了,也有非绑定方法,目前我们还没有见到。
def func():pass class Foo():
def func(self):
print('func') f1 = Foo() # 打印内存地址
print(func)
print(Foo.func)
print(f1.func)
print(f1) # <function func at 0x103bfa840>
# <function Foo.func at 0x103bfa6a8>
# <bound method Foo.func of <__main__.Foo object at 0x103b2f390>>
# <__main__.Foo object at 0x1044ac390>
# 这个函数是这个类的绑定方法
9,对象找名字的时候,如果类里面没有,是不可以找全局的的,最高找到类。类里面就是一个独立的,他不能一级一级网上找了
10,import一个包,相当于类的实例化过程,后面的点调用,类似于对象访问方法,访问属性。
11,类的特性:面向对象的三大特性:继承,多态和封装
12,一种类里面的用法,组合,这个我们其实一直在用,只不过不知道他就叫做组合。
13,组合:一个对象的属性值是另外一个类的对象(alex.weapon这个是weapon类的对象),组合的调用方式会出现两个点的调用
class Dog:
def __init__(self,name,aggr,hp,kind):
self.name = name
self.aggr = aggr
self.hp = hp
self.kind = kind def bite(self,person):
person.hp -=self.aggr class Person:
def __init__(self,name,aggr,hp,gender):
self.name = name
self.aggr = aggr
self.hp = hp
self.gender = gender
self.money = 0 def attack(self,dog):
dog.hp -= self.aggr def get_weapon(self,weapon):
if self.money >= weapon.price:
self.weapon = weapon # 这个是组合使用的关键点
self.aggr += weapon.aggr
weapon.njd -= 1
self.money -= weapon.price
else:
print('money is not enough') class Weapon:
def __init__(self,name,aggr,njd,price):
self.name = name
self.aggr = aggr
self.njd = njd
self.price = price # 给武器定义一个大招
def handl18(self,person):
person.hp -= self.aggr *2
self.njd -=1 alex = Person('alex',10,1000,'male')
alex.money += 1000 # 充钱买武器
jin = Dog('jin',5,600,'teddy')
w = Weapon('dagou-stick',100 ,3,998) jin.bite(alex)
print(alex.hp) alex.attack(jin)
print(jin.hp) alex.get_weapon(w)
print(alex.weapon)
alex.attack(jin)
print(jin.hp)
alex.weapon.handl18(jin) # 组合
print(jin.hp)
14,组合练习,计算圆环的周长和面积
from math import pi class Circle:
def __init__(self,radius):
self.radius = radius def area(self):
return self.radius**2 *pi def perimeter(self):
return 2 *pi *self.radius class Ring():
def __init__(self,big_circle,small_circle):
self.big_circle = big_circle
self.small_circle = small_circle def area(self):
return self.big_circle.area() - self.small_circle.area() # 组合的应用 def perimeter(self):
return self.big_circle.perimeter() + self.small_circle.perimeter() big_circle = Circle(10)
small_circle = Circle(5)
ring = Ring(big_circle, small_circle)
print(ring.area())
print(ring.perimeter())
15,稍微改进一点的圆环
from math import pi class Circle:
def __init__(self,radius):
self.radius = radius def area(self):
return self.radius**2 *pi def perimeter(self):
return 2 *pi *self.radius class Ring():
def __init__(self,big_r,small_r):
self.big_circle = Circle(big_r)
self.small_circle = Circle(small_r) def area(self):
return self.big_circle.area() - self.small_circle.area() # 组合的应用 def perimeter(self):
return self.big_circle.perimeter() + self.small_circle.perimeter() ring = Ring(10, 5)
print(ring.area())
print(ring.perimeter())
16,组合练习二
class Birthday:
def __init__(self,year,month,day):
self.year = year
self.month = month
self.day = day class Course:
language = ['Chinese']
def __init__(self,teacher,course_name,period,price):
self.teacher = teacher
self.name = course_name
self.period = period
self.price = price def func(self):
pass class Teacher:
def __init__(self,name,age,gender,birthday):
self.name = name
self.age = age
self.gender = gender
self.birthday = birthday
self.course = Course(self,'python',6,20000) # 实现了双向关联,当然不是必须的 b = Birthday(2018,3,2)
lisa = Teacher('lisa',30,'female',b)
c = Course(lisa,'linux',3,15000)
print(lisa.birthday.day)
print(c.teacher.name) # 双向关联
print(lisa.course.price)
17,大作业,后补
day23:类的命名空间和组合的更多相关文章
- day 23-1 类的命名空间、组合
类的命名空间 类与对象命名空间 类里 可以定义两种属性 静态属性 动态属性 类中的静态变量 可以被对象和类调用对于不可变数据类型来说,类变量最好用类名操作对于可变数据类型来说,对象名的修改是共享的,重 ...
- 类的命名空间&组合
类的命名空间◆类中的静态变量可以被类调用也可以被对象调用◆对不可变数据类型来说,类变量最好用类名操作 class Person: money = 0 mother = Person() father ...
- python学习之老男孩python全栈第九期_day023知识点总结——类和对象命名空间、组合
一. 类和对象命名空间类里 可以定义两种属性: 1. 静态属性 2. 动态属性 class Course: language = 'Chinese' def __init__(self, teache ...
- day23 01 类的命名空间
day23 01 类的命名空间 一.初识面向对象复习 定义类: class 函数:方法 动态属性 变量:类属性 静态属性 过程: (1)_init_方法:初始化:def _init_(self,参数 ...
- [Yii2.0] 以Yii 2.0风格加载自定义类或命名空间 [配置使用Yii2 autoloader]
Yii 2.0最显著的特征之一就是引入了命名空间,因此对于自定义类的引入方式也同之前有所不同.这篇文章讨论一下如何利用Yii 2.0的自动加载机制,向系统中引入自定义类和命名空间.本文旨在抛砖引玉,如 ...
- 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间
[源码下载] 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间 作者:webabcd 介绍速战速决 之 PHP 动态地创 ...
- Python 类的命名空间
Python中类的定义其实就是执行代码块: class cc: a=0 print '+++++', print a 会直接执行print语句而不是在实例化cc时执行.执行后会生成对应的类的命名空间. ...
- php加了命名空间没引入初始化文件:类的命名空间要与文件夹名一致namespace Business\Event;缺少了Event
php加了命名空间没引入初始化文件:类的命名空间要与文件夹名一致namespace Business\Event;缺少了Event
- 编译不通过:提示XXXX不是类或命名空间名 的解决办法
手动写了一个类,需要引入预编译头stdafx.h.结果编译时提示XXXX不是类或命名空间名. 处理方法:将#include "stdafx.h"放在最前面.
随机推荐
- POJ 1410 Intersection (线段和矩形相交)
题目: Description You are to write a program that has to decide whether a given line segment intersect ...
- 微信小程序:将中文语音直接转化成英文语音
作者:瘟小驹 文章来源<微信小程序个人开发全过程> 准备工作: 准备工具:Eclipse.FileZilla.微信开发者工具.一个配置好SSL证书(https)的有域名的服务器 所需 ...
- KNN与K-Means的区别
KNN(K-Nearest Neighbor)介绍 Wikipedia上的 KNN词条 中有一个比较经典的图如下: KNN的算法过程是是这样的: 从上图中我们可以看到,图中的数据集是良好的数据,即都打 ...
- jmeter测试wordpress使用base64进行鉴权
1.下载插件 对密码进行加密 2.安装插件 3.使用插件 4.使用base64对上面获取到的密码进行二次加密 echo -n "用户:密码" | base64 将以上命令键入lin ...
- 基于netty的socket服务端触发了channelInactive方法,但实际连接没有断开的问题
背景: 一个中小型H5游戏,后端使用基于 netty 的socket服务 服务端 分为 分发服务器 & 业务服务器,业务服务器可负载 用户客户端与分发服务器连接 分发服务器再作为客户端与每台业 ...
- ReactiveCocoa - study
//KVO值监控,当alertTip改变时调用, filter对alertTip值进行过滤,此处当alertTip存在而长度不为0时,执行suscribeNext方法,弹出提示 [[RACObserv ...
- .net OADate 转javascript的Datetime js 5位 日期 转换
以下是将.net的OADate转成javascript的DateTime函数. 其中参数oadate是.net那里传过来的UTC时间的double.记得 一定是UTC时间. .net Double o ...
- 5.基于优化的攻击——CW
CW攻击原论文地址——https://arxiv.org/pdf/1608.04644.pdf 1.CW攻击的原理 CW攻击是一种基于优化的攻击,攻击的名称是两个作者的首字母.首先还是贴出攻击算法的公 ...
- zoj3781
zoj3781赛场上堵在了缩点上emmmmm把原始图相同颜色的方块缩成一个点,然后与它周围不同颜色的联通块连双向边,然后枚举每个点然后求最大深度的最小值因为每次翻转都相当于深度+1(可以手动模拟一下 ...
- 20172328 2018-2019《Java软件结构与数据结构》第六周学习总结
20172328 2018-2019<Java软件结构与数据结构>第六周学习总结 概述 Generalization 本周学习了第十章:非线性集合与数据结构--树.主要讨论了树的使用和实现 ...