python 11 类与对象
给大家介绍对象hhhh
封装
举个例子,把乱七八糟的数据仍到列表,数据层面的封装
把常用的代码打包成一个函数,封装
外观特征(静态) 能做什么(动态)
对象=属性(静态) + 方法(动态)
1.方法多用函数
2.类是图纸,对象是根据图纸制作的东西
3.类在整体结构中和函数很像,所以为了区分,类的开头字母大写,函数小写
class Turtle: #封装类
属性
方法
def climb() #方法中的一个例子
tt=Turtle() #创建类,与函数类似
tt.climd() #调用类中的函数
oo 面向对象
封装,信息隐蔽技术 list1.sort(),排序列表,并不知道过程
继承,子类自动共享父类之间数据和方法的机制
class Mylist(list): #继承list的方法和属性
pass #什么都不用做
list2 = Mylist()
list2.append(0)
list2
[0]
多态:对不同对象调用同一方法,结果因对象而变
class A:
def fun(self):
print('a')
class B:
def fun(self):
print('b')
a=A()
b=B()
a.fun #a
b.fun #b
面向对象编程
self要写进第一个参数对象
self名称不是必须的,在python中self不是关键词,你可以定义成a或b或其它名字都可以,但是约定成俗(为了和其他编程语言统一,减少理解难度),不要搞另类,大家会不明白的。
self指的是类实例对象本身(地址) (注意:不是类本身)。
class中函数调用
在给出一个实例以后,我们调用类中的具体方法(即函数)时,默认传入了self参数(即实例地址)
这样对象不唯一,也会各自运行各自的结果
class Ba:
def setname(self,name): #self为实例地址
self.name = name # 代入 实例.name = name
def kick(self):
print('%s' % self.name) #打印 实例.name
a = Ba()
a.setname('a') #self地址为a(实例地址)
b = Ba()
b.setname('b')
c = Ba()
c.setname('0')
a.kick() #a
c.kick() #0
构造函数
构造方法类似于类似init()这种初始化方法,来初始化新创建对象的状态,在一个对象类创建以后会立即调用
__init__(self,param1,param2.....)
class Ba:
def __init__(self,name)
self.name = name
def kick(self):
print('%s' % self.name)
b = Ba('b')
b.kick() #b
class Per:
name= 'a'
>>p = Per()
>>p.name #a
class Per:
__name= 'a'
def g(self):
return self.__name
>>p = Per()
>>p.name #报错,__为私有
>>p.g #返回a
>>p._Per__name #返回a
_类名__变量名
继承
class Deribedclassname(baseclassname): #()中为父类,名字
class Pae:
def hello(self):
print('调用父类')
class Chi(Pae):
pass
>>p = Pae()
>>p.hello
调用父类
>>c = hello()
>>c.hello()
调用父类
如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性
对父类不受影响
class Chi(Per):
def hello(self):
print("调用子类“)
>>c = Chi()
>>c.hello()
调用子类
>>p.hello()
调用父类
import random as r class Fish:
def __init__(self):
self.x = r.randint(0,10)
self.y = r.randint(0,10) def move(self):
self.x -= 1
print("我的位置:",self.x,self.y) class Gold(Fish):
pass class Carp(Fish):
pass class Sa(Fish):
pass class Shark(Fish):
def __init__(self): #与父类冲突,覆盖父类,需要解决方案
self.hungry = True def eat(self):
if self.hungry:
print("天天有吃的")
self.hungry = False
else:
print("太撑了")
1.调用未绑定的父类方法
def __init__(Fish):
Fish.__init__(self) #在子类执行的前面调用父类,self是子类的,Shark
self.hugry = True
2.使用 super函数
def __init__(Fish): #这里的父类是Fish,super调用的就是父类的__init__()
super().__init__() #有很多父类也不用一个个写,自动一层层找出__init__()的方法,
self.hugry = True
多重继承,多写几个父类,尽量避免使用,可能出现不可预见的BUG(致命)
组合:在一个类中以另外一个类的对象作为数据属性,称为类的组合
实例.调入类.类中数据
class Turtle:
def __init__(self,x):
self.num = x class Fishl:
def __init__(self,x):
self.num = x class Pool:
def __init(self,x,y):
self.turtle = Turtle(x) #把T中数据调入self.turtle,可使用self.turtle.num
self.fish = Fish(y) #实例.调入类.类中数据 def print_num(self):
print("乌龟 %d,小鱼%d" % (self.turtle.num,self.fish.num))
Mix -in
(转载)
class Weapon:
def prick(self, obj): # 这是该装备的主动技能,扎死对方
obj.life_value -= 500 # 假设攻击力是500 class Person: # 定义一个人类
role = 'person' # 人的角色属性都是人 def __init__(self, name):
self.name = name # 每一个角色都有自己的昵称;
self.weapon = Weapon() # 给角色绑定一个武器; egg = Person('egon')
egg.weapon.prick()
#egg组合了一个武器的对象,可以直接egg.weapon来使用组合类中的所有方法
用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,比如教授有生日,教授教python课程
人狗大战(转载)
class Person: # 定义一个人类
role = 'person' # 人的角色属性都是人 def __init__(self, name, aggressivity, life_value, money):
self.name = name # 每一个角色都有自己的昵称;
self.aggressivity = aggressivity # 每一个角色都有自己的攻击力;
self.life_value = life_value # 每一个角色都有自己的生命值;
self.money = money def attack(self,dog):
# 人可以攻击狗,这里的狗也是一个对象。
# 人攻击狗,那么狗的生命值就会根据人的攻击力而下降
dog.life_value -= self.aggressivity
class Dog: # 定义一个狗类
role = 'dog' # 狗的角色属性都是狗 def __init__(self, name, breed, aggressivity, life_value):
self.name = name # 每一只狗都有自己的昵称;
self.breed = breed # 每一只狗都有自己的品种;
self.aggressivity = aggressivity # 每一只狗都有自己的攻击力;
self.life_value = life_value # 每一只狗都有自己的生命值; def bite(self,people):
# 狗可以咬人,这里的狗也是一个对象。
# 狗咬人,那么人的生命值就会根据狗的攻击力而下降
people.life_value -= self.aggressivity
class Weapon: #装备
def __init__(self,name, price, aggrev, life_value):
self.name = name
self.price = price
self.aggrev = aggrev
self.life_value = life_value def update(self, obj): #obj就是要带这个装备的人
obj.money -= self.price # 用这个武器的人花钱买所以对应的钱要减少
obj.aggressivity += self.aggrev # 带上这个装备可以让人增加攻击
obj.life_value += self.life_value # 带上这个装备可以让人增加生命值 def prick(self, obj): # 这是该装备的主动技能,扎死对方
obj.life_value -= 500 # 假设攻击力是500
lance = Weapon('长矛',200,6,100)
egg = Person('egon',10,1000,600) #创造了一个实实在在的人egg
ha2 = Dog('二愣子','哈士奇',10,1000) #创造了一只实实在在的狗ha2 #egg独自力战"二愣子"深感吃力,决定穷毕生积蓄买一把武器
if egg.money > lance.price: #如果egg的钱比装备的价格多,可以买一把长矛
lance.update(egg) #egg花钱买了一个长矛防身,且自身属性得到了提高
egg.weapon = lance #egg装备上了长矛 print(egg.money,egg.life_value,egg.aggressivity) print(ha2.life_value)
egg.attack(ha2) #egg打了ha2一下
print(ha2.life_value)
egg.weapon.prick(ha2) #发动武器技能
print(ha2.life_value) #ha2不敌狡猾的人类用武器取胜,血槽空了一半
转载
class BirthDate:
def __init__(self,year,month,day):
self.year=year
self.month=month
self.day=day class Couse:
def __init__(self,name,price,period):
self.name=name
self.price=price
self.period=period class Teacher:
def __init__(self,name,gender,birth,course):
self.name=name
self.gender=gender
self.birth=birth
self.course=course
def teach(self):
print('teaching') p1=Teacher('egon','male',
BirthDate('','',''), #把B中数据调入T中,实例p1
Couse('python','','4 months')
) print(p1.birth.year,p1.birth.month,p1.birth.day) print(p1.course.name,p1.course.price,p1.course.period)
'''
运行结果:
1995 1 27
python 28000 4 months
'''
类写完就是类对象,实例对象
class C:
def x:
count = 0
>>a=C()
>>b=C()
>>c.count+=10 #创建实例对象的属性
>>c.x() #报错,属性如果与方法名相同,属性覆盖方法
>>a.count
0
>>c.count
10
>>C.count #类对象
0
>>C.count += 100
>>a.count #增加100
100
>>c.count #实例对象的属性,不变
10
避免这种事发生,不要试图在一个类里边定义出所有能想到的特性和方法,应该理由继承和组合机制进行扩展。
用不同的词性命名,如属性名用名词,方法名用动词
关于绑定
class C:
def set(self,x,y)
self.x = x
self.y = y
def printXY(self):
print(self.x,self.y)
>>d = C()
>>d.__dict__
{}
>>C.__dice__
{.............数据,方法.}
>>d.set(1,2) #静态的绑定类对象的方法里
>>d.__dice__
{'y':2,'x':1}
>>def C
>>e =C() #报错
>>d.printXY() #1 2
尽量用实例属性,self
不要用类属性
python 11 类与对象的更多相关文章
- 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法
1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...
- python的类和对象2(self参数)
python的类和对象2(self参数) 1.python里面对象的方法都会有self参数,它就相当于C++里面的this指针:绑定方法,据说有了这个参数,Python 再也不会傻傻分不清是哪个对象在 ...
- Python初识类与对象
Python初识类与对象 类与对象 世界观角度分析类与对象 类是一个抽象的概念,而对象是一个实体的存在,对象由类创造而出,每个对象之间互相独立互不影响,一个对象可以同时拥有多个类的方法,实例化就是通过 ...
- python的类与对象
类与对象 1.什么是类 类和函数一样是程序编程的一种方式,在处理某些问题的时候类比函数更加适合让编程变得简化,在python里面函数式编程和类编程都是为了简化代码的一种编程方式,具体应用那个则由具体问 ...
- Python 定制类与其对象的创建和应用
1.创建新类Athlete,创建两个唯一的对象实例sarah james,他们会继承Athlete类的特性 >>> class Athlete: def __init__(self, ...
- 搞懂Python的类和对象名称空间
代码块的分类 python中分几种代码块类型,它们都有自己的作用域,或者说名称空间: 文件或模块整体是一个代码块,名称空间为全局范围 函数代码块,名称空间为函数自身范围,是本地作用域,在全局范围的内层 ...
- python的类和对象(类的静态字段)
转自:http://www.cnblogs.com/Eva-J/p/5044411.html 什么是静态字段 在开始之前,先上图,解释一下什么是类的静态字段(我有的时候会叫它类的静态变量,总之说的都是 ...
- python的类和对象——番外篇(类的静态字段)
什么是静态字段 在开始之前,先上图,解释一下什么是类的静态字段(我有的时候会叫它类的静态变量,总之说的都是它.后面大多数情况可能会简称为类变量.): 我们看上面的例子,这里的money就是静态字段,首 ...
- python的类和对象——进阶篇
写在前面的话 终于,又到了周五.当小伙伴们都不再加班欢欢喜喜过周末的时候,我刚刚写完这一周的游戏作业,从面对晚归的紧皱眉头到现在的从容淡定,好像只有那么几周的时间.突然发现:改变——原来这么简单.很多 ...
随机推荐
- python-多任务编程05-协程(coroutine)
协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源). 为啥说它是一个执行单元,因为它自带CPU上下文.这样只要在合适的时机, 我们可以把一个协程 切换 ...
- git问题解决
1.如果系统中有一些配置文件在服务器上做了配置修改,然后后续开发又新添加一些配置项的时候, 在发布这个配置文件的时候,会发生代码冲突: error: Your local changes to the ...
- 构建私有的verdaccio npm服务
用了很长一段时间的cnpmjs做库私有库,发现两个问题 1. 最开始是mysql对表情emoij的支持不好,但由于数据库没办法调整所以只好把第三方库都清掉,只留私有库 2. mac 上面cnpm in ...
- html标签集合
---恢复内容开始--- 基础 <!DOCTYPE>,<html>,<title>,<body>,<h1>to<h6>,< ...
- github提交报错
github正确提交步骤 https://www.cnblogs.com/alex-415/p/6912294.html 可能的错误 提交前没有先pull,主要的原因是在创建repository的时候 ...
- PHP mt_rand() 函数
实例 生成随机数: <?phpecho(mt_rand() . "<br>");echo(mt_rand() . "<br>"); ...
- bzoj 2989: 数列
LINK:数列 需要动一点脑子 考虑查询 暴力显然不行 考虑把绝对值拆开. 当x<=y ax<=ay时 有 y-x+ay-ax<=k x+ax>=y+ay-k 可以发现在满足前 ...
- intel:spectre&Meltdown侧信道攻击(五)—— DRAM address mapping
前面介绍了row hammer,理论上很完美,实际操作的时候会面临很尴尬的问题:内存存储数据最小的单位是cell(就是个电容,充电是1,放电是0),无数个横着的cell组成row,无数个竖着的cell ...
- TCP为什么做三次握手、四次挥手
TCP 为什么做三次握手.四次挥手? TCP 是为了解决可靠传输出现的.为了实现可靠性,TCP 做了流量控制.拥塞控制,并且在建立.关闭连接前做些机制:三次握手.四次挥手. 三次握手是为了让客户端.服 ...
- python网络爬虫实战PDF高清完整版免费下载|百度云盘|Python基础教程免费电子书
点击获取提取码:vg1y python网络爬虫实战帮助读者学习Python并开发出符合自己要求的网络爬虫.网络爬虫,又被称为网页蜘蛛,网络机器人,是一种按照一定的规则,自动地抓取互联网信息的程序或者脚 ...