面向对象编程

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. zookeeper集群配置与启动——实战

    1,准备: A:三台linxu服务器: 10.112.29.177 10.112.29.172 10.112.29.174 命令 hostname 得到每台机器的 hostname vm-10-112 ...

  2. C#3.0 特性

    C#3.0特性 隐式类型的本地变量和数组 对象初始值设定项 集合初始值设定项 扩展方法 匿名类型 lambda表达式 查询关键字 自动实现的属性 分布方法定义 lambda表达式与表达式树 https ...

  3. 转载自安卓巴士 【收藏】2015必须推荐的Android框架,猿必读系列!

    一.Guava Google的基于java1.6的类库集合的扩展项目,包括collections, caching, primitives support, concurrency libraries ...

  4. iOS开发——项目需求-快速回到当前界面的顶部

    利用UIWindow实现快速到达顶部 如下图,在状态栏添加一个没有颜色的UIWindow(里面添加一个按钮),实现点击这个按钮时能快速的回到当前界面的顶部 核心代码 一.利用UIWindow实现到达顶 ...

  5. [Asp.net MVC]Asp.net MVC5系列——从控制器访问模型中的数据

    目录 概述 从控制器访问模型中的数据 强类型模型与@model关键字 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net M ...

  6. BZOJ1861——book

    就是给你一摞书,然后又询问第k大,编号为x的书是第几大,然后修改书的位置 splay模板题...然而我还是不会,,,又遇到lrj的书的坑了,rj的书里没有father,顿时弄得我ask不会搞了 注意合 ...

  7. win32程序组成

    程序代码+UI资源——RC编译器整合——>EXE档案. UI资源:二进制代码(借助工具产生,并以各种扩展名的文件存在),程序员必须在资源描述文档(.rc)中描述他们. RC编译器(RC.EXE) ...

  8. js 判断鼠标进去方向

    function fx(id){ var obj= document.getElementById(id); var fun=function(e){ var w=obj.offsetWidth; v ...

  9. Sqli-LABS通关笔录-4

    这一关卡让我学习到了 1.管他如何,想方设法先让sql报错再说.从报错中构造sql注入语句. 2.单引号不行就来双引号.括号等等的. 这次单引号没反应了.以后我们先来黑盒测试,实在没辙再看代码. -1 ...

  10. STM32通用定时器(转载)

    STM32的定时器功能很强大,学习起来也很费劲儿. 其实手册讲的还是挺全面的,只是无奈TIMER的功能太复杂,所以显得手册很难懂,我就是通过这样看手册:while(!SUCCESS){看手册-}才搞明 ...