• 《笨方法学Python》加分题 40


    习题 40:模块、类和对象

    字典和模块使用方式有点类似,只是语法不同([键]和.键):
    Python里一个通用模式:1)类似“键=值”风格的容器;2)通过“键”的名称获取其中的值


    模块是包含函数和变量的 Python 文件,可以导入这个文件,可以使用 "." 操作符访问模块中的函数和变量。

    模块还可以用一种方法去理解:可以把它们当做一种特殊的字典,通过它们可以存储一些 Python 代码,可以通过 "." 操作符访问这些代码。Python 还有一种另外一种代码结构用来实现类似的目的,那就是类,通过类,你可以把一组函数和数据放到一个容器中,从而用 "." 操作符访问类中的函数和变量。

    使用类而非模块的原因:其重复创建很多出来(类可以多次实例化),这些实例之间也不会相互干涉;而模块一次导入之后,整个程序中只有这么一份内容

    对象相当于迷你导入

     

    现在有三种方法可以从某个东西里获取东西:

    # dict sytle
    mystuff['apples']
     
    # module style            调用模块
    mystuff.apples()        # 访问模块的函数
    mystuff.tangerine       # 访问模块的变量
     
    # class style
    thing = MyStuff()         调用类
    thing.apples()          # 访问类的函数
    thing.tangerine         # 访问类的变量
    class Song:
        
        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 right there"])
     
    bulls_on_parade = Song(["There rally around the family",
                            "With pockets full of shells"])
                            
    happy_bday.sing_me_a_song()
     
    bulls_on_parade.sing_me_a_song()

    创建 __init__ 或者别的类函数时需要多加一个 self 变量。

    习题 41:学习面向对象术语

     1 import random
     2 from urllib.request import urlopen
     3 import sys
     4 
     5 WORD_URL = "http://learncodethehardway.org/words.txt"
     6 WORDS = []
     7 
     8 PHRASES = {
     9     "class %%%(%%%):":
    10       "Make a class named %%% that is-a %%%.",
    11     "class %%%(object):
    	def __init__(self, ***)" :
    12       "class %%% has-a __init__ that takes self and *** params.",
    13     "class %%%(object):
    	def ***(self, @@@)" :    
    14       "class %%% has-a function *** that takes self and @@@ params.",
    15     "*** = %%%()":
    16       "Set *** to an instance of class %%%.",
    17     "***.***(@@@)":
    18       "From *** get the *** function, call it with params self, @@@.",
    19     "***.*** = '***'":
    20       "From *** get the *** attribute and set it to '***'."
    21 }
    22 
    23 # do they want to drill phrases first
    24 if len(sys.argv) == 2 and sys.argv[1] == "english":
    25     PHRASE_FIRST = True
    26 else:
    27     PHRASE_FIRST = False
    28 
    29 # load up the words from the website
    30 for word in urlopen(WORD_URL).readlines():
    31     WORDS.append(str(word.strip(), encoding = "utf-8"))
    32 
    33 def convert(snippet, phrase):
    34     class_names = [w.capitalize() for w in
    35                    random.sample(WORDS, snippet.count("%%%"))]
    36     other_names = random.sample(WORDS, snippet.count("%%%"))  
    37     results = []
    38     param_names = []
    39 
    40     for i in range(0, snippet.count("@@@")):
    41         param_count = random.randint(1,3)
    42         param_names.append(','.join(
    43             random.sample(WORDS, param_count)))
    44 
    45     for sentence in snippet, phrase:
    46         result = sentence[:]
    47 
    48         #fake class names
    49         for word in class_names:
    50             result = result.replace("%%%", word, 1)
    51         #fake other names
    52         for word in other_names:
    53             result = result.replace("***", word, 1)
    54         #fake parameter names
    55         for word in param_names:
    56             result = result.replace("@@@", word, 1)
    57 
    58         results.append(result)
    59     return results
    60 
    61 # keep going until they hit CTRL-D
    62 try:
    63     while True:
    64         snippets = list(PHRASES.keys())
    65         random.shuffle(snippets)
    66 
    67         for snippet in snippets:
    68             phrase = PHRASES[snippet]
    69             question, answer = convert(snippet, phrase)
    70             if PHRASE_FIRST:
    71                 question, answer = answer, question
    72 
    73             print(question)
    74 
    75             input("> ")
    76             print(f"ANSWER: {answer}
    
    ")
    77 
    78 except EOFError:
    79     print("
    Bye")
    80 
    81     result = sentence[:]
    82     print(result)

    习题 42:对象、类及从属关系

     1 ## Animal is-a object (yes, sort of confusing) look at the extra credit
     2 class Animal(object):
     3     pass
     4 
     5 ## Dog is-a Animal
     6 class Dog(Animal):
     7 
     8     def __init__(self, name):
     9         ## ??
    10         self.name = name
    11 
    12 ## Cat is-a Animal
    13 class Cat(Animal):
    14 
    15     def __init__(self, name):
    16         ## ??
    17         self.name = name
    18     
    19 ## Person is-a Animal
    20 class Person(Animal):
    21 
    22     def __init__(self, name):
    23         ## ??
    24         self.name = name
    25         
    26         ## Person has-a pet of some kind
    27         self.pet = None
    28 
    29 ## Employee is-a Person
    30 class Employee(Person):
    31 
    32     def __init__(self, name, salary):
    33         ## ?? hmm what is this strange magic?
    34         super(Employee, self).__init__(name)
    35         ## ??
    36         self.salary =salary
    37 
    38 ## Fish is-a object
    39 class Fish(object):
    40     pass
    41 
    42 ## Salmon is-a Fish
    43 class Salmon(Fish):
    44     pass
    45 
    46 ## Halibut is-a Fish
    47 class Halibut(Fish):
    48     pass
    49 
    50 ## rover is-a dog
    51 rover = Dog("Rover")
    52 
    53 ## satan is-a Cat
    54 satan = Cat("Satan")
    55 
    56 ## mary is-a Person
    57 mary = Person("Mary")
    58 
    59 ## mary has-a pet, satan is-a Cat
    60 mary.pet = satan
    61 
    62 ## ??
    63 frank = Employee("Frank", 12000)
    64 
    65 ## ??
    66 frank.pet =rover
    67 
    68 ## ??
    69 flipper =Fish()
    70 
    71 ## ??
    72 crouse = Salmon()
    73 
    74 ## ??
    75 harry = Halibut()

    习题41涉及到的函数

    https://www.runoob.com/python/python-func-str.html

    https://www.runoob.com/python3/python3-string-strip.html

    https://www.runoob.com/python3/python3-func-number-random.html

    https://www.runoob.com/python3/python3-random-number.html

    https://www.runoob.com/python/python-exercise-example94.html

    https://www.runoob.com/python3/python3-string-capitalize.html

    https://www.runoob.com/python3/python3-att-dictionary-keys.html

    https://www.runoob.com/python3/python3-string-count.html

    https://www.runoob.com/python3/python-copy-list.html

    https://www.runoob.com/python3/python3-string-replace.html

    https://www.runoob.com/python3/python3-func-number-shuffle.html

  • 相关阅读:
    关于FPS游戏痕的问题
    移动端输入框获取焦点后,虚拟键盘弹起,把固定的底部也顶起来了
    正则匹配移动端
    js 判断对象是否为空
    jsonp跨域原理解析
    Webstorm的一些常用快捷键
    webstorm创建js文件时自动生成js注释
    帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
    this指北 (一篇读懂)
    原型链
  • 原文地址:https://www.cnblogs.com/python2webdata/p/11487813.html
Copyright © 2020-2023  润新知