Python基础---Task10:类与实例
类模板创建空类绑定类属性优化类内存实例的不同表示属性封装实例兼容with语句@property动态定义属性
类模板
创建空类
格式:class <类名> (继承类名) : … 注意类名最好首字母大写
class Course(object):
pass
python_base
= Course
()
>> <__main__
.Course at
0x1b743b565f8>
绑定类属性
class Course(object):
def __init__(self
, name
, how_long
, teacher
, level
,
address
,family
= AF_INET
, type = SOCK_STREAM
):
self
.name
= name
self
.duration
= how_long
self
.teacher
= teacher
self
.__level
= level
优化类内存
class Course(object):
__slot__
= ['name','how_long', 'teacher', 'level',
'address']
def __init__(self
, name
, how_long
, teacher
, level
,
address
,family
= AF_INET
, type = SOCK_STREAM
):
self
.name
= name
self
.duration
= how_long
self
.teacher
= teacher
self
.__level
= level
实例的不同表示
使用__repr__和__str__方法,常用来简化调试和输出
class Course(object):
def __init__(self
, name
):
self
.name
= name
def __repr__(self
):
return 'Course{0.name!r}'.format(self
)
def __str__(self
):
return '{0.name!s}'.format(self
)
属性封装
单下划线开头的属性名是内部实现:sys._getframe() 双下划线开头的属性名是私有属性:如 self.__private = xxx 会被系统重新命名为_className__private def __privateMethod(self): … 会被系统重新命名为_className__privateMethod
实例兼容with语句
class Course(object):
def __init__(self
, address
,family
= AF_INET
, type = SOCK_STREAM
):
self
.address
= address
self
.family
= family
self
.type = type
self
.sock
= None
def __enter__(self
):
if self
.sock
is not None:
raise RuntimeError
('Already connected')
self
.sock
= socket
(self
.family
,self
.type)
self
.sock
.connect
(self
.address
)
return self
.sock
def __exit__(self
, exc_ty
, exc_val
, tb
):
self
.sock
.close
()
self
.sock
= None
@property动态定义属性
class Course(object):
def __init__(self
, name
, how_long
, teacher
, level
):
self
.name
= name
self
.duration
= how_long
self
.teacher
= teacher
self
.__level
= level
@
property
def teacher(self
):
return self
._teacher
@teacher
.setter
def teacher(self
,teacher
):
if not isinstance(teacher
,str):
raise TypeError
('teacher must be str')
self
._teacher
= teacher
参考文献: python3- cookbook https://python3-cookbook.readthedocs.io/zh_CN/latest/index.html
14 days