文档章节

笨方法学Python, Lesson 40 - 44

好好先生_1028
 好好先生_1028
发布于 2015/11/06 17:53
字数 1507
阅读 871
收藏 6

Exercise 40

代码

class Song(object):
    
    def __init__(self, lyrics):
        self.lyrics = lyrics
        
    def sing_me_a_song(self):
        for line in self.lyrics:
            print line 
            
happy_bday = Song(["Happy birthday to you",
                  "I don't want to get sued",
                  "So I'll stop reght there"])
                  
bulls_on_parade = Song(["They really around the family",
                        "With pockets full of shells"])
                        
happy_bday.sing_me_a_song()

bulls_on_parade.sing_me_a_song()

输出

Notes

①class定义类,__init__()初始化类

②定义类、实例化类、调用相关函数与变量的方法

Exercise 41 

代码

import random 
from urllib import urlopen
import sys 

WORD_URL = "http://learncodethehardway.org/words.txt"
WORDS = []

PHRASES = {
    "class %%%(%%%):":
    "Make a class named %%% that is-a %%%.",
    "class %%%(object):\n\tdef __init__(self, ***)":
    "class %%% has-a __init__ that takes self and *** parameters.",
    "class %%%(object):\n\tdef ***(self, @@@)":
    "class %%% has-a function named *** that takes self and @@@ parameters.",
    "*** = %%%()":
    "Set *** to an instance of class %%%.",
    "***.***(@@@)":
    "From *** get the *** function, and call it with parameters self, @@@",
    "***.*** = ***":
    "From *** get the *** attribute and set it to '***'."
}

# do they want to drill phrases first
if len(sys.argv) == 2 and sys.argv[1] == 'english':
    PHRASES_FIRST = True 
else:  
    PHRASES_FIRST = False 
    
# load up the words from the website 
for word in urlopen(WORD_URL).readlines():
    WORDS.append(word.strip())
    
    
def convert(snippet, phrases):
    class_names = [w.capitalize() for w in 
                   random.sample(WORDS, snippet.count("%%%"))]
    other_names = random.sample(WORDS, snippet.count("***"))
    results = []
    param_names = []
    
    for i in range(0, snippet.count("@@@")):
        param_count = random.randint(1,3)
        param_names.append(', '.join(random.sample(WORDS, param_count)))
        
    for sentence in snippet, phrases:
        result = sentence[:]
        
        # fake class names 
        for word in class_names:
            result = result.replace("%%%", word, 1)
            
        # fake other names 
        for word in other_names:
            result =result.replace("***", word, 1)
            
        # fake parameters lists 
        for word in param_names:
            result = result.replace("@@@", word, 1)
            
        results.append(result)
        
    return results 
    
    
# keep going until then hit CTRL^D 
try:
    while True:
        snippets = PHRASES.keys()
        random.shuffle(snippets)
        
        for snippet in snippets:
            phrase = PHRASES[snippet]
            question, answer = convert(snippet, phrase)
            if PHRASES_FIRST:
                question, answer = answer, question 
                
            print question 
            
            user_answer = raw_input("> ")
            print "ANSWER: %s" % answer 
            if user_answer == answer:
                print "Congraduatons! Your answer is very right!\n\n"
            else:
                print "Sorry, Your answer is a little deferent frome the right answer.\n\n"
except EOFError:
    print "\nBye"

输出

Notes:

①本节练习的目的是提供练习面向对象编程的概念的方法,代码中用到了循环与条件判断、字典迭代以及一些新函数

②urlopen().readlines()类似文件的readlines()方法,打开网页并读取网页内容所有行,并返回内容组成的列表

③字符串的strip()方法,用于去除字符串中的字符。需要注意,传入的参数是字符串时,会去除首尾所有在字符串内的字符。

参数为空时,删除空白符,包括" ","\n","\t","\r"

s1 = "aaabc cPython is the best bbbcaabc"
print s1.strip("abc")
print s1.strip("abc ")      # abc后面有一个空格
s2 = "\n\n\tPython is the best\t\n"
print s2
print s2.strip()

该例的输出

④Python大小写转换函数:capitalize()转换首字母大写其他字母小写;upper()全部转换为大写;lower()全部转换为小写;title()全部单词首字母大写,其他字母小写

s = "python is the best!"
print s.capitalize()
print s.upper()
s = "Python is the best!"
print s.lower()
print s.title()

输出

⑤python random模块

random.sample(sequence, i)  从指定序列中随机截取指定长度的片段

random.randint(a, b) 返回一个随机数,介于a和b之间,可以取到边界值

random.shuffle(sequence) 将一个列表中的元素打乱

import random
list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]   
sample_ = random.sample(list, 5)
print sample_

for i in range(0,10):
    print random.randint(1,10),

print 
random.shuffle(list)
print list

该例输出

⑥字符串replace()方法 

>>> s = "P***on is the best!"
>>> print s.replace("***", "yth", 1)    #第一个参数是被替换字串,第二个参数是替换字串,第三个参数是最大替换次数
Python is the best!

Exercise 42 

代码

## Animal is-a object (yes, sort of confusing), look at the extra credit.
class Animal(object):
    pass 

## Dog is-a Animal
class Dog(Animal):
    
    def __init__(self, name):
        ## Dog has-a name 
        self.name = name 
        
##  Cat is-a Animal
class Cat(Animal):
    
    def __init__(self, name):
        ##  Cat has-a name 
        self.name = name 
        
##  Person is-a object
class Person(object):
    
    def __init__(self, name):
        ##  Person has-a name 
        self.name = name 
        
        ## Person has-a pet of some kinde 
        self.pet = None
        
##  Employee is-a Person
class Employee(Person):
    
    def __init__(self, name, salary):
        ##  hnm what is this strange magic?
        super(Employee, self).__init__(name)
        ##  Employee has-a salary
        self.salary = salary
        
##  Fish is-a object 
class Fish(object):
    pass 
    
##  Salmon is-a Fish
class Salmon(Fish):
    pass 
    
##  Halibut is-a Fish 
class Halibut(Fish):
    pass 
    

##  rover is-a Dog
rover = Dog("Rover")

##  satan is-a Cat
satan = Cat("Satan")

##  mary is-a Person
mary = Person("Mary")

## mary has-a pet 
mary.pat = satan

##  frank is-a Employee
frank = Employee("Frank", 120000)

##  frank has-a pet 
frank.pet = rover 

##  flipper is-a Fish 
flipper = Fish()

## crouse is-a Salmon
crouse = Salmon()

##  harry is-a Halibut
harry = Halibut()

本节代码无输出

Notes:

①super()函数在类中是调用父类的函数。Python虽然支持通过直接调用父类名调用父类的方法,但缺点是更改父类名称时要遍历所以用到此父类方法的子类。super()就是为了解决这一问题。详见http://blog.csdn.net/johnsonguo/article/details/585193

②__init__(),类中定义了此方法的话,则在创建类的实例时对实例首先执行此方法,可理解为类的初始化

Exercise 44

代码

A.隐式继承(Implicit Inheritance)

class Parent(object):
    
    def implicit(self):
        print "PARENT implicit()"
        
class Child(Parent):
    pass 
    
dad = Parent()
son = Child()

dad.implicit()
son.implicit()

输出

Notes:

①pass是Python中创建空白代码块的办法,在前面也已经见到过pass的用处

②当在父类中定义了一个函数,在子类中没有定义时,就会发生隐式继承。也就是说,所有的子类(Child这样的类)会自动获得父类所具有的的函数的功能。

B.显式覆些(Override Explicitly)

class Parent(object):
    
    def override(self):
        print "PARENT override()"
     
class Child(Parent):
    
    def override(self):
        print "CHILD override()"
        
dad = Parent()
son = Child()

dad.override()
son.override()

输出

Notes:

①子类中定义与父类中相同名称的函数时,子类的函数会取代父类函数的功能

C. 运行前或运行后覆写

class Parent(object):
    
    def altered(self):
        print "PARENT altered()"
        
class Child(Parent):
    
    def altered(self):
        print "CHILD, BEFORE PARENT altered()"
        super(Child, self).altered()
        print "CHILD, AFTER PARENT altered()"
        
dad = Parent()
son = Child()

dad.altered()
son.altered()

输出

Notes

①super函数的调用

D.混合情况

class Parent(object):
    
    def override(self):
        print "PARENT override()"
        
    def implicit(self):
        print "PARENT implicit()"
        
    def altered(self):
        print "PARENT altered()"
        
class Child(Parent):
    
    #  override 
    def override(self):
        print "CHILD override()"
        
    def altered(self):
        # override
        print "CHILD, BEFORE PARENT altered()"
        # implicit
        super(Child, self).altered()
        print "CHILD, AFTER PARENT altered()"
        
dad = Parent()
son = Child()

dad.implicit()
son.implicit()

dad.override()
son.override()

dad.altered()
son.altered()

输出

E.合成(composition)

class Other(object):
    
    def override(self):
        print "OTHER override()"
        
    def implicit(self):
        print "OTHER implicit()"
        
    def altered(self):
        print "OTHER altered()"
        
class Child(object):
    
    def __init__(self):
        self.other = Other()
        
    def implicit(self):
        self.other.implicit()
        
    def override(self):
        print "CHILD override()"
        
    def altered(self):
        print "CHILD, BEFORE OTHER altered()"
        self.other.altered()
        print "CHILD, AFTER OTHER altered()"
        
son = Child()

son.implicit()
son.override()
son.altered()

输出

Notes:

①作者的建议:除非必要,尽量避免多重继承这个"恶魔"

②如果有代码需要在不同场合用到,则用合成来把它们做成模块

③阅读Python风格指南

链接:英文  https://www.python.org/dev/peps/pep-0008/#copyright

中文  http://my.oschina.net/u/1433482/blog/464444

© 著作权归作者所有

共有 人打赏支持
好好先生_1028
粉丝 23
博文 79
码字总数 78986
作品 0
温州
笨方法学Python,Lesson 27 - Lesson 31

Exercise 27 本节介绍True 和 False,即布尔值,无代码 ①记忆真值表 Exercise 28 本节主要是掌握布尔代数运算 ①布尔运算,先计算括号,然后是等号、不等号等运算,再计算not,最后计算and...

好好先生_1028
2015/10/27
0
0
笨方法学python,Lesson 37

本节无代码,总结了python的所有关键字,如下 A. Keywords: B.数据类型 C.转义序列 D.格式化字符串 E.操作符

好好先生_1028
2015/10/29
0
0
笨方法学python,Lesson 22, 23

Exercise 22 python关键词及符号等合集 Exercise 23 无

好好先生_1028
2015/10/26
0
0
python-35:urllib 和 urllib2 模块

首先,urllib 和 urllib2 是python 自带的模块,所以我们可以通过官网文档来查看它们的详细信息,这里依然给出网址,感兴趣的同学可以看一下 urllib模块:http://python.usyiyi.cn/python278...

达岭凹老大
2015/12/01
229
0
我们可以在同一个虚拟机中运行 Python 2 和 3 代码而不需要更改代码吗?

从理论上来说,可以。Zed Shaw 说过一句著名的话,如果不行,那么 Python 3 一定不是图灵完备的。但在实践中,这是不现实的,我将通过给你们举几个例子来说明原因。 对于字典(dict)来说,这...

作者: Łukasz Langa
05/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Bash工作管理详解

Bash工作管理 Bash的工作是对具体任务的一个抽象表述,更确切的说是对管道的应用上的表述。Bash中的工作在形式上表现为一组相关进程或单个进程。工作进程组分为前台和后台,前台进程会对键盘...

小陶小陶
28分钟前
2
0
Qt那些事0.0.1

LIBS += -L$$PWD/lib/ -lStv1QMAKE_POST_LINK += $$QMAKE_COPY $$replace(PWD,"/","\\")\lib\Stv1.dll $$replace(OUT_PWD,"/","\\")\debug\Stv1.dll pro文件里,写起来按理说应该是轻松地......

Ev4n
38分钟前
2
0
如何正确的使用动态VPS(Linux)自动更换IP

背景 现在越来越多的人开始玩网赚项目,蚂蚁再小也是肉,薅羊毛的羊毛党越来越多,一些网赚项目也越来越受欢迎,但是一般的网赚项目都是要求真实用户的,所以要想获得大量的真实ip,一种动态...

bengozhong
44分钟前
2
0
分布式任务系统(LTS)部署学习使用

章节速览 背景介绍 环境部署 LTS架构原理&代码样例 个人心得经验 一、背景介绍 很多公司应该都会遇到job服务部署执行时:定时、并发、分布式这些问题。有的人就是只跑一个job服务,这样会简单...

硅步积千里
54分钟前
31
0
kotlin使用spring data redis(一)

1.引包 #忘记引用这个包的下场就是#nested exception is java.lang.NoClassDefFoundError: org/apache/commons/pool2/impl/GenericObjectPoolConfigcompile 'org.apache.commons:commons-p......

weidedong
57分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部