【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学好?兴趣,兴趣,兴趣!找到你自己感兴趣的点进行切入,并找到兴趣点进行自我驱动是最好的学习方式! 推荐两本书,一本作为 ...
随机推荐
- 解析某些特殊格式XML文件时,获取不到根节点问题
还是在语音识别这块.在读取本地的SRGS的XML后,无法获取到根节点<grammar>. 下面是SRGS.XML文件(只给出了根节点) <?xml version="1.0 ...
- sqlite采用的ORM包
关注了两个库的使用方式,一个是Dapper,一个是Simple.Data.考虑一个可选的是ORMLite, Dapper和simple.data都比较好用,动态对象的使用妙不可言,区别在于 //Dap ...
- Unity3D引擎扩展中的编辑器定制方法
http://gamerboom.com/archives/36432 作者:Richard Fine Unity3D的方便之处在于,它很容易地扩展编辑器套件.每款游戏都对加工有着不同的需求,可以快速 ...
- 移动端rem切图
1.为什么用rem 根据屏幕大小,自动调整大小 2.如何使用rem 分以下几步 a.用ps把设置稿弄成640px或者750px的(记得等比例缩放) b.调试时记得把浏览器默认最小字体设置为最小.手机端 ...
- 跟着百度学PHP[4]OOP面对对象编程-9-封装性,访问控制[private、pubic、protected]
其实之前就已经在封装的时候说到了.这个也属于封装的范畴吧. 用到的三个关键字(旁边是其中文翻译) private(私有的) public(公众的) protected(受保护的) 00X1 priva ...
- 跟着百度学PHP[4]OOP面对对象编程-6-构造方法(__construct)和构析方法(__destruct)
函数就是成员方法(方法有三:构造方法.成员方法.析构方法) 下面是两种方法. 构造方法和构析方法 00x1 构造方法 构造方法会在创建对象之后自动调用.其名称为__construct <?php ...
- zabbix3.0报错记录
一.问题描述 在zabbix_server添加变量时,出现了以下的报错,
- 【Java】嵌套For循环性能优化案例
参考资料:http://cgs1999.iteye.com/blog/1596671 1 案例描述 某日,在JavaEye上看到一道面试题,题目是这样的:请对以下的代码进行优化 for (int i ...
- ADO.NET和ADO.NET Entity Framework
ADO.NET 3.0 用于访问和操作数据的两个主要组件是 .NET Framework 数据提供程序和 DataSet. .NET Framework 数据提供程序 .NET Framework 数 ...
- (转) Docker swarm 之介绍与使用
今天,在站内看到一篇关于Docker Swarm 的文章,非常好,在这里转过来,方便日后查阅 :) 原贴链接: http://www.cnblogs.com/rio2607/p/4445968.htm ...