Python - 类(未完待续)

编写类

class Person:
    """
    Class to represent a person
    """
    def __init__(self): # 构造函数
        self.name = ''
        self.age = -1

显示对象

class Person:
    """
    Class to represent a person
    """
    def __init__(self): # 构造函数
        self.name = ''
        self.age = -1

    def display(self): # 打印对象内容
        print('Person(name={0}, age={1})'.format(self.name, self.age))

if __name__ == '__main__':
    p = Person()
    p.name = 'Cytosine'
    p.age = 16
    p.display()

__str__ 与 __repr__

class Person:
    """
    Class to represent a person
    """
    def __init__(self): # 构造函数
        self.name = ''
        self.age = -1

    def display(self): # 打印对象内容
        print('display(): Person(name={0}, age={1})'.format(self.name, self.age))

    def __str__(self): # 生成对象的字符串表示, str(p)
        return 'Person(name={0}, age={1})'.format(self.name, self.age)

    def __repr__(self):
        return str(self)


if __name__ == '__main__':
    p = Person()
    p.name = 'Cytosine'
    p.age = 16
    p.display()
    print(str(p))
    print(p)

对象初始化

class Person:
    """
    Class to represent a person
    """
    def __init__(self, name = '', age = -1): # 构造函数
        self.name = name
        self.age = age

    def display(self): # 打印对象内容
        print('display(): Person(name={0}, age={1})'.format(self.name, self.age))

    def __str__(self): # 生成对象的字符串表示, str(p)
        return 'Person(name={0}, age={1})'.format(self.name, self.age)

    def __repr__(self):
        return str(self)



if __name__ == '__main__':
    p1 = Person()
    print(str(p1))

    p2 = Person('Cytosine', 16)
    print(str(p2))

虽然给__init__中的参数指定默认值很容易,但不建议这么做。空的Person对象没有真正意义上的姓名和年龄,在之后处理Person对象的代码中,要始终检查这一点。而始终检查这些特殊情况,很快会成为一种负担,而且也很容易被忘记。

setter() 与 特性装饰器

class Person:
    """
    Class to represent a person
    """
    def __init__(self, name = '', age = -1): # 构造函数
        self.name = name
        self.setAge(age)

    def display(self): # 打印对象内容
        print('display(): Person(name={0}, age={1})'.format(self.name, self.age))

    def __str__(self): # 生成对象的字符串表示, str(p)
        return 'Person(name={0}, age={1})'.format(self.name, self.age)

    def __repr__(self):
        return str(self)

    def setAge(self, age):
        if 0 < age < 150:
            self.age = age



if __name__ == '__main__':
    p1 = Person('Cytosine', 16)
    print(str(p1))
    p1.setAge(17)
    print(str(p1))

特性装饰器

输入p.setAge(30)比输入p.age = 30更繁琐,故而有 特性装饰器

class Person:
    """
    Class to represent a person
    """
    def __init__(self, name = '', age = -1): # 构造函数
        self._name = name
        self._age = age

    @property
    def age(self):
        return self._age

    @age.setter
    def setAge(self, age):
        if 0 < age < 150:
            self._age = age

    def display(self): # 打印对象内容
        print(self)

    def __str__(self): # 生成对象的字符串表示, str(p)
        return 'Person(name={0}, age={1})'.format(self._name, self._age)

    def __repr__(self):
        return str(self)


if __name__ == '__main__':
    p = Person('Cytosine', 16)
    p.display()
    p.age = -1
    p.display()

私有变量

p._age = -3

依旧可以修改person.age的值。
在变量名开头包含两个下划线__则表明该变量是私有变量,在Class Person外不能被访问。
而要直接访问Person.__age需要在Person前加一个下划线,如:

_Person.__age = 1

继承

class Player:
    def __init__(self, name):
        self._name = name
        self._score = 0

    def reset(self):
        self._score = 0

    def increase_score(self):
        self._score += 1

    def get_name(self):
        return self._name

    def __str__(self):
        return 'name={0}, score={1}'.format(self._name, self._score)

    def __repr__(self):
        return str(self)

class Human(Player): # Human 继承自 Player
    pass # Python中表示什么都不做

if __name__ == '__main__':
    p = Player('Cytosine')
    print(p)

    h = Human('Lovegood')
    print(h)
    h.increase_score()
    print(h)

重写方法

class Player:
    def __init__(self, name):
        self._name = name
        self._score = 0

    def reset(self):
        self._score = 0

    def increase_score(self):
        self._score += 1

    def get_name(self):
        return self._name

    def __str__(self):
        return 'Player: name={0}, score={1}'.format(self._name, self._score)

    def __repr__(self):
        return str(self)

class Human(Player): # Human 继承自 Player
    # pass # Python中表示什么都不做
    def __str__(self):
        return 'Human: name={0}, score={1}'.format(self._name, self._score)

    def __repr__(self):
        return str(self)

if __name__ == '__main__':
    p = Player('Cytosine')
    print(p)

    h = Human('Lovegood')
    print(h)
    h.increase_score()
    print(h)

多态

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 1,568评论 0 6
  • 大纲 0.OC数据类型 1.声明一个类 2.实现一个类 3.创建一个对象 4.对象的注意点 5.对象方法 6.类方...
    天天想念阅读 1,138评论 0 3
  • Objective-C 1. import的用法 拷贝文件内容可以自动防止文件的内容被重复拷贝(#define宏定...
    马文涛阅读 5,359评论 3 17
  • 姓名:丁美 公司:宁波大发化纤有限公司 期数:六项精进234期学员 组号:谦虚一组 【日精进打卡第2天】 【知~学...
    丁美阅读 121评论 0 0
  • 开始读书快乐的享受生活吧
    小莊阅读 297评论 0 0