【python】入门学习(九)
面向对象编程
class 定义类,类的值可以修改
_ _init_ _(self) 初始化函数,创建类时自动调用
self 指向对象本身,可以用其他的名字 但不建议
#person.py
class Person:
"""Class to represent a person"""
def __init__(self):
self.name = ''
self.age = 0
>>> p = Person()
>>> p
<__main__.Person object at 0x022467B0>
>>> p.age
0
>>> p.name
''
>>> p.age = 55
>>> p.age
55
显示对象:
可以用print来打印,也可以用__str__ 注意两者的调用方式不同。
def display(self):
print("Person('%s',%d)" % (self.name,self.age))
def __str__(self):
return "Person('%s',%d)" % (self.name,self.age)
def display2(self):
print(str(self))
>>> p.display()
Person('',0)
>>> str(p)
"Person('',0)"
>>> p.display2()
Person('',0)
官方表示:__repr__ 就是直接输入对象时的显示,建议显示创建对象时所需要的代码 如果定义了__repr__但没有定义__str__,则调用str()时会显示repr()的内容。
#person.py
class Person:
"""Class to represent a person"""
def __init__(self):
self.name = ''
self.age = 0
def display(self):
print("Person('%s',%d)" % (self.name,self.age))
def __str__(self):
return "Person('%s',%d)" % (self.name,self.age)
def display2(self):
print(str(self))
def __repr__(self):
return str(self)
>>> p = Person()
>>> p
Person('',0)
初始化:
可在__init__函数中初始化对象,可以有默认值,但不建议用默认值,因为需要在之后的使用中加入检查
def __init__(self, name = '', age = 0):
self.name = name
self.age = age
>>> p = Person()
>>> p
Person('',0)
>>> p = Person('Ann', 15)
>>> p
Person('Ann',15)
设置函数与获取函数:
可以防止设置不合理的值:
def set_age(self,age):
if 0 < age <=150:
self.age = age
>>> p = Person("Andy",20)
>>> p
Person('Andy',20)
>>> p.set_age(1000)
>>> p
Person('Andy',20)
>>> p.set_age(40)
>>> p
Person('Andy',40)
也可以使用特性装饰器
需要用@修饰,修改变量的语法可以变简单 看得不是很懂http://www.open-open.com/lib/view/open1395285030019.html中给出了一些解释
@property
def age(self):
return self._age @age.setter
def age(self, age):
if 0 < age <= 150:
self._age = age
>>> p = Person('Peter', 18)
>>> p
Person('Peter',18)
>>> p.age = 150
>>> p
Person('Peter',150)
>>> p.age = -3
>>> p
Person('Peter',150)
私有变量:用双下划线开始的变量为私有变量 访问私有变量需要加上_类名称 可以防止意外修改变量 建议最开始将变量都设为私有,之后再用充分的理由转为公有
#person.py
class Person:
"""Class to represent a person"""
def __init__(self, name = '', age = 0):
self.__name = name
self.__age = age
def display(self):
print("Person('%s',%d)" % (self.__name,self.__age))
def __str__(self):
return "Person('%s',%d)" % (self.__name,self.__age)
def display2(self):
print(str(self))
def __repr__(self):
return str(self)
def set_age(self,age):
if 0 < age <=150:
self.__age = age @property
def age(self):
return self.__age @age.setter
def age(self, age):
if 0 < age <= 150:
self.__age = age
>>> p = Person('a',2)
>>> p
Person('a',2)
>>> p.__age = 4
>>> p
Person('a',2)
>>> p._Person__age = 4
>>> p
Person('a',4)
继承:
class 类名(父类名):
pass
用新的类继承父类,pass表示什么也不做。也可以重写父类中的函数
#players.py
class Player:
def __init__(self, name):
self._name = name
self._score = 0
def reset_score(self):
self._score = 0
def incr_score(self):
self._score = self._score + 1
def get_name(self):
return self._name
def __str__(self):
return "name = '%s', score = %s" % (self._name, self._score)
def __repr__(self):
return 'Player(%s)' % str(self) class Human(Player):
def __repr__(self):
return 'Human(%s)' % str(self) class Computer(Player):
def __repr__(self):
return 'Computer(%s)' % str(self)
>>> p = Player('Peter')
>>> p
Player(name = 'Peter', score = 0)
>>> h = Human('Wang')
>>> h
Human(name = 'Wang', score = 0)
>>> c = Computer('Cob')
>>> c
Computer(name = 'Cob', score = 0)
多态:同一函数不同的实现方法
下面编写一个简单游戏,两个人选择数字,谁选择的数比另一个人的小1则获胜
get_move函数采用多态 play_undercut返回三元组 可以传入两个人类玩家 两个计算机玩家 或是一个人类玩家和一个计算机玩家
#players.py
class Player:
def __init__(self, name):
self._name = name
self._score = 0
def reset_score(self):
self._score = 0
def incr_score(self):
self._score = self._score + 1
def get_name(self):
return self._name
def __str__(self):
return "name = '%s', score = %s" % (self._name, self._score)
def __repr__(self):
return 'Player(%s)' % str(self) def play_undercut(p1,p2):
p1.reset_score()
p2.reset_score()
m1 = p1.get_move()
m2 = p2.get_move()
print("%s move %s" % (p1.get_name(), m1))
print("%s move %s" % (p2.get_name(), m2))
if m1 == m2 - 1:
p1.incr_score()
return p1,p2,'%s wins!' % p1.get_name()
elif m2 == m1 - 1:
return p1,p2,'%s wins!' % p2.get_name()
else:
return p1,p2,'draw: no winner' class Human(Player):
def __repr__(self):
return 'Human(%s)' % str(self)
def get_move(self):
while True:
try:
n = int(input('%s move(1 - 10): ' %self.get_name()))
if 1 <= n <= 10:
return n
else:
print('Oops!')
except:
print('Oops!') import random
class Computer(Player):
def __repr__(self):
return 'Computer(%s)' % str(self)
def get_move(self):
return random.randint(1,10)
>>> c = Computer('Cook')
>>> h = Human('Man')
>>> play_undercut(c,h)
Man move(1 - 10): 1
Cook move 5
Man move 1
(Computer(name = 'Cook', score = 0), Human(name = 'Man', score = 0), 'draw: no winner')
【python】入门学习(九)的更多相关文章
- python入门学习:9.文件和异常
python入门学习:9.文件和异常 关键点:文件.异常 9.1 从文件中读取数据9.2 写入文件9.3 异常9.4 存储数据 9.1 从文件中读取数据 9.1.1 读取整个文件 首先创建一个pi_ ...
- python入门学习:8.类
python入门学习:8.类 关键点:类 8.1 创建和使用类8.2 使用类和实例8.3 继承8.4 导入类 8.1 创建和使用类 面向对象编程是最有效的软件编写方法之一.在面向对象编程中,你编写 ...
- python入门学习:7.函数
python入门学习:7.函数 关键点:函数 7.1 定义函数7.2 传递实参7.3 返回值7.4 传递列表7.5 传递任意数量的实参7.6 将函数存储在模块中 7.1 定义函数 使用关键字def ...
- python入门学习:6.用户输入和while循环
python入门学习:6.用户输入和while循环 关键点:输入.while循环 6.1 函数input()工作原理6.2 while循环简介6.3 使用while循环处理字典和列表 6.1 函数in ...
- python入门学习:5.字典
python入门学习:5.字典 关键点:字典 5.1 使用字典5.2 遍历字典5.3 嵌套 5.1 使用字典 在python中字典是一系列键-值对.每个键都和一个值关联,你可以使用键来访问与之相关 ...
- python入门学习:4.if语句
python入门学习:4.if语句 关键点:判断 4.1 一个简单的测试4.2 条件测试4.3 if语句 4.1 一个简单的测试 if语句基本格式如下,注意不要漏了冒号 1if 条件 :2 ...
- python入门学习:3.操作列表
python入门学习:3.操作列表 关键点:列表 3.1 遍历整个列表3.2 创建数值列表3.3 使用列表3.4 元组 3.1 遍历整个列表 循环这种概念很重要,因为它是计算机自动完成重复工作的常 ...
- python入门学习:2.列表简介
python入门学习:2.列表简介 关键点:列表 2.1 列表是什么2.2 修改.添加和删除元素2.3 组织列表 2.1 列表是什么 列表,是由一系列按特定顺序排列的元素组成.你可以创建包含字母表 ...
- Python入门学习:1.变量和简单的数据类型
python入门学习:1.变量和简单的数据类型 关键点:变量.字符串.数字 1.1 变量的命名和使用1.2 字符串1.3 数字1.4 注释 1.1 变量的命名和使用 变量,顾名思义是一个可变的量, ...
- Python入门学习之路,怎么 “开心,高效,踏实” 地把Python学好?兴趣,兴趣,兴趣!
Python入门学习之路,怎么 “开心,高效,踏实” 地把Python学好?兴趣,兴趣,兴趣!找到你自己感兴趣的点进行切入,并找到兴趣点进行自我驱动是最好的学习方式! 推荐两本书,一本作为 ...
随机推荐
- UIView不接受触摸事件的三种情况
1.不接收用户交互 userInteractionEnabled = NO 2.隐藏 hidden = YES 3.透明 alpha = 0.0 ~ 0.01 4. 如果子视图的位置超出了父视图的有效 ...
- 清北学堂模拟day6 花
[问题描述] 商店里出售n种不同品种的花.为了装饰桌面,你打算买m支花回家.你觉得放两支一样的花很难看,因此每种品种的花最多买1支.求总共有几种不同的买花的方案?答案可能很大,输出答案mod p的值. ...
- PHP简易聊天室&调试问题
在进入login.php程序之后 <?php error_reporting(E_ALL^E_NOTICE); session_start(); //装载Session库,一定要放在首行 $u ...
- solr
一.启动命令 tar -zxvf solr-.tgz cd solr-\example java -jar start.jar 默认监听8983端口 java -Djetty.port= -jar s ...
- Python-Matplotlib安装及简单使用
在使用NumPy进行学习统计计算时是枯燥的,大量的数据令我们很头疼,所以我们需要把它图形化显示. Matplotlib是一个Python的图形框架,类似于MATLAB和R语言. Matplotlib的 ...
- NOSQL的学习
NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",指的是非关系型的数据库.NoSQL用于超大规模数据的存储.(例如谷歌或Facebook每天为他们的 ...
- iOS开发——UI进阶篇(六)键盘处理
一.键盘通知我们经常需要在键盘弹出或者隐藏的时候做一些特定的操作,因此需要监听键盘的状态 键盘状态改变的时候,系统会发出一些特定的通知UIKeyboardWillShowNotification // ...
- 五款最佳Linux下载管理器推荐
导读 新的Linux用户从Windows转换过来时面临的困难之一就是,找到一款优秀的下载管理器.如果你是或曾经是Windows用户,可能熟悉互联网下载管理器(IDM).下载加速器Plus(DAP)之类 ...
- 160809225_叶桦汀_C语言程序设计实验2 选择结构程序设计_进阶
#include<stdio.h> #include<math.h> int main() { int a,b,c,l,p,s; printf("请输入三个数:&qu ...
- BZOJ 4579: [Usaco2016 Open]Closing the Farm
Description 依次删去一个点和它的边,问当前图是否连通. Sol 并查集. 倒着做就可以了. 每次将一个点及其的边加入,如果当前集合个数大于 1,那么就不连通. Code /******** ...