Python学习笔记 - 面向对象高级编程
根据廖雪峰的Python教程做成的笔记,其中不包含全部知识点,仅是重点或是容易发生混淆或者忘记的部分。
1. 使用slots
由于Python可以在程序执行过程中向class添加成员变量,为了防止随意添加,可以使用__slots__
变量指定可以添加的成员变量。
class Student():
__slots__ = ('name', 'age')
# 程序执行
s1 = Student()
s1.name = 'Tom'
s1.age = 10
s1.score = 99 # 此行代码会报错,因为slots中没有指定score
2. 定制类
class中凡是__xxx__
形式的变量或函数名都是有特殊意义的,除__slots__
,__init__()
外,还有很多。
- __str__()
class Student():
def __init__(self, name, age):
self.name = name
self.age = age
# 测试
s1 = Student('Tom', 16)
print(s1)
# 输出:
# <__main__.Student object at 0x000000000092E780>
显然输出不够直观,使用__str__()
后:
class Student():
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return 'Student object (name:%s, age:%d)' % (self.name, self.age)
# 测试
s1 = Student('Tom', 16)
print(s1)
# 输出:
# Student object (name:Tom, age:16)
下面这些方法目前感觉华而不实,暂时不说了,用到的时候再补充。
- __iter__()
- __next__()
- __getitem__()
- __getattr__()
- __call__()
3. 枚举类
定义枚举类的两个方法:
- 方法1:
使用枚举类,此方法默认枚举的第一个成员的值为1。
from enum import Enum
Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
for name, member in Month.__members__.items():
print(name, '=>', member, ',', member.value)
# 输出:
# Jan => Month.Jan , 1
# Feb => Month.Feb , 2
# Mar => Month.Mar , 3
# Apr => Month.Apr , 4
# May => Month.May , 5
# Jun => Month.Jun , 6
# Jul => Month.Jul , 7
# Aug => Month.Aug , 8
# Sep => Month.Sep , 9
# Oct => Month.Oct , 10
# Nov => Month.Nov , 11
# Dec => Month.Dec , 12
- 方法2:
从枚举类继承,此方法可以自定义枚举的值。
class Weekday(Enum):
Sun = 0
Mon = 1
Tue = 2
Wed = 3
Thu = 4
Fri = 5
Sat = 6
for name, member in Weekday.__members__.items():
print(name, '=>', member, ',', member.value)
# 输出:
# Sun => Weekday.Sun , 0
# Mon => Weekday.Mon , 1
# Tue => Weekday.Tue , 2
# Wed => Weekday.Wed , 3
# Thu => Weekday.Thu , 4
# Fri => Weekday.Fri , 5
# Sat => Weekday.Sat , 6