面向对象编程

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】入门学习(九)的更多相关文章

  1. python入门学习:9.文件和异常

    python入门学习:9.文件和异常 关键点:文件.异常 9.1 从文件中读取数据9.2 写入文件9.3 异常9.4 存储数据 9.1 从文件中读取数据 9.1.1 读取整个文件  首先创建一个pi_ ...

  2. python入门学习:8.类

    python入门学习:8.类 关键点:类 8.1 创建和使用类8.2 使用类和实例8.3 继承8.4 导入类 8.1 创建和使用类   面向对象编程是最有效的软件编写方法之一.在面向对象编程中,你编写 ...

  3. python入门学习:7.函数

    python入门学习:7.函数 关键点:函数 7.1 定义函数7.2 传递实参7.3 返回值7.4 传递列表7.5 传递任意数量的实参7.6 将函数存储在模块中 7.1 定义函数   使用关键字def ...

  4. python入门学习:6.用户输入和while循环

    python入门学习:6.用户输入和while循环 关键点:输入.while循环 6.1 函数input()工作原理6.2 while循环简介6.3 使用while循环处理字典和列表 6.1 函数in ...

  5. python入门学习:5.字典

    python入门学习:5.字典 关键点:字典 5.1 使用字典5.2 遍历字典5.3 嵌套 5.1 使用字典   在python中字典是一系列键-值对.每个键都和一个值关联,你可以使用键来访问与之相关 ...

  6. python入门学习:4.if语句

    python入门学习:4.if语句 关键点:判断 4.1 一个简单的测试4.2 条件测试4.3 if语句 4.1 一个简单的测试   if语句基本格式如下,注意不要漏了冒号 1if 条件 :2     ...

  7. python入门学习:3.操作列表

    python入门学习:3.操作列表 关键点:列表 3.1 遍历整个列表3.2 创建数值列表3.3 使用列表3.4 元组 3.1 遍历整个列表   循环这种概念很重要,因为它是计算机自动完成重复工作的常 ...

  8. python入门学习:2.列表简介

    python入门学习:2.列表简介 关键点:列表 2.1 列表是什么2.2 修改.添加和删除元素2.3 组织列表 2.1 列表是什么   列表,是由一系列按特定顺序排列的元素组成.你可以创建包含字母表 ...

  9. Python入门学习:1.变量和简单的数据类型

    python入门学习:1.变量和简单的数据类型 关键点:变量.字符串.数字 1.1 变量的命名和使用1.2 字符串1.3 数字1.4 注释 1.1 变量的命名和使用   变量,顾名思义是一个可变的量, ...

  10. Python入门学习之路,怎么 “开心,高效,踏实” 地把Python学好?兴趣,兴趣,兴趣!

    Python入门学习之路,怎么 “开心,高效,踏实” 地把Python学好?兴趣,兴趣,兴趣!找到你自己感兴趣的点进行切入,并找到兴趣点进行自我驱动是最好的学习方式!       推荐两本书,一本作为 ...

随机推荐

  1. EF-联合查询-结果集-Group by-统计数目

    EF框架用着痛并且快乐着··· 毕竟用习惯了SQL语句直接硬查的··· SELECT C0.ID,C_C.Name,C_C.C_COUNT FROM article_type C0 INNER JOI ...

  2. Problem B Boxes in a Line

     省赛B题....手写链表..其实很简单的.... 比赛时太急了,各种手残....没搞出来....要不然就有金了...注:对相邻的元素需要特判..... Problem B Boxes in a Li ...

  3. tcp三次握手与四次挥手

  4. WebStorm设置编辑器中的字体大小

    启动webStorm之后,点击“FIle"菜单,选择其下的”Settings" 2.在左侧的菜单中选择“Editor/Colors & Fonts/Font 在右侧Sche ...

  5. IOS学习目录

    一.UI 1.基础控件 2.高级控件 二.多线程网络 1.网络请求.网络安全 2.

  6. Code First04---关于上下文DbContext

    这章主要讲怎么配置DbContext的子类访问的数据库的位置. 我相信大家最经常使用的数据库位置的配置方式就是配置文件了,也就是通过App.Config 或Web.Config来配置要访问的数据库. ...

  7. HNU 12885 Bad Signal(模拟)

    题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12885&courseid=274 解题报告:一共有n个 ...

  8. BZOJ4610——[Wf2016]Ceiling Functi

    水题一道,不是很懂为啥没人做... 1.题意:纠正一下..bzoj的题意不是很对...注意不是堆,是不平衡的二叉树,就是非旋转的treap, 另外...插入的时候,小于插在左边..大于等于插在右边 2 ...

  9. SNMP详解

    简单网络管理协议(SNMP)是TCP/IP协议簇的一个应用层协议.在1988年被制定,并被Internet体系结构委员会(IAB)采纳作为一个短期的网络管理解决方案:由于SNMP的简单性,在Inter ...

  10. HTTP协议详解篇(待续)

    1.工作流程 HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: (1)建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务 ...