编写类
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)
网友评论