編寫類
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)