zoukankan      html  css  js  c++  java
  • 【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')
  • 相关阅读:
    C#基础知识——类的继承
    值传递与引用传递01
    今天接到任务了!
    傅立叶变换,时域,频域二
    傅立叶变换,时域,频域一
    常用运放选型一览表
    用三段140字符以内的代码生成一张1024×1024的图片
    [收藏夹整理]电子类链接
    [收藏夹整理]三维重构部分
    MSP430之自动增益程控放大main备份
  • 原文地址:https://www.cnblogs.com/dplearning/p/3954452.html
Copyright © 2011-2022 走看看