一.内置类属性
1.什么是内置类属性
声明类的时候,系统自动添加的属性(字段、对象属性)
class Person:
num = 61
def __init__(self, name):
self.name = name
def eat(self, food):
return '%s正在吃%s' % (self.name, food)
p1 = Person('小明')
# 1)__name__ - 字段
# 类名.__name__ - 获取类的名字(字符串)
#
# 2)__doc__ - 字段
# 类名.__doc__ - 获取类的说明文档
#
# 3)__class__ - 对象属性
# 对象.__class__ - 获取对象对应的类,和type(对象)功能一样,返回值是类
#
# 4)__dict__ - 字段/对象属性(用的多)
# 对象.__dict__ - 将对象中所有的属性和对应的值转换成一个字典中的键值对(一个对象一个字典)
# 类.__dict__ - 将类转换成一个字典,获取类中所有的字段作为key,对应的值为value
# 注意:如果设置了slots的值,当前类的对象就不能使用slots属性
#
# 5)__module__ - 字段
# 类.__module__ - 获取当前类是在哪个模块中声明的,返回模块名字
#
# 6)__bases__ - 字段
# 类.__bases__ - 获取当前类的父亲,返回一个元组
2.补充:定制当前类的对象的打印
# 1)重写__str__方法
# def __str__(self):
# return '<'+str(self.__dict__)[1:-1]+'>'
#
# 问题:当打印存储在序列中的对象时依旧打印对象地址!
#
# 2)重写__repr__方法
# def __repr__(self):
# return '<'+str(self.__dict__)[1:-1]+'>'
# 练习:将字典转换成对象
class Date:
def __init__(self, dict1: dict):
for key in dict1:
setattr(self, key, dict1[key])
二.私有化
1.访问权限:公开(public)、保护()、私有()
公开 - 公开的属性和方法在类的内部、外部能够使用,也能被继承
保护 - 保护的属性和方法只能在类的内部使用或被继承
私有 - 私有的属性和方法只能在类的内部使用
2.python中属性和方法的访问权限
python的类中所有的属性和方法本质都是公开的,python中私有化仅有提示功能
私有化提示:在需要私有化的属性名或者方法名前加'_'(不能以双下划线结尾)
原理:在私有的属性名和方法名前加了'类名'
class Person:
__num = 61
def __init__(self, name):
self.name = name
def __eat(self, food):
return '%s正在吃%s' % (self.name, food)
p1 = Person('小明')
print(p1._Person__eat('米饭'))
三.对象属性的getter和setter
1.什么是getter和setter
当需要在获取属性值之前进行额外操作时就需要给该属性添加getter
当需要在给属性赋值之前进行额外操作时就需要给该属性添加setter
2.给属性添加getter
1)在需要添加getter的属性名前加'_'
2)在@property装饰器后声明一个对象方法
a.将属性名去掉下划线作为方法名
b.该方法除了self外不需要其他参数
c.函数的返回值就是获取这个属性的时候得到的值
3)在外部使用属性的时候,通过'对象.属性(不带下划线)'去使用
注意:使用时实质是在调用属性方法获取返回值
3.给属性添加setter - python中属性不能只添加setter
1)在需要添加getter的属性名前加'_'
2)在'@属性名.setter'装饰器后声明一个对象方法
a.将属性名去掉下划线作为方法名
b.该方法除了self外还需要1参数
c.不需要返回值
3)在外部使用属性的时候,通过'对象.属性(不带下划线)'去使用
注意:使用时实质是在调用属性方法去赋值
4.补充 - 判断数据是否为一种类型
isinstance(value, 类型)
5.如何编写错误类型
class WriteError(Exception):
def __str__(self):
return 'Read Only!'
class Person:
num = 61
def __init__(self, name, age, gender):
self.name = name
self.age = age
if gender == '男':
self._gender = 1
elif gender == '女':
self._gender = 0
@property
def gender(self):
if self._gender == 1:
return '男'
else:
return '女'
@gender.setter
def gender(self, value):
if value == '男':
self._gender = 1
else:
self._gender = 0
p1 = Person('小明', 18, '男')
p1.gender = '男'
print(p1.gender)
# 练习,写一个矩形类,属性:长、宽、面积、周长
# 从生活的角度看这个矩形
class Rect:
def __init__(self, length, width):
if isinstance(length, int):
if length > 0:
self._length = length
else:
raise ValueError
else:
raise TypeError
if isinstance(width, int):
if width > 0:
self._width = width
else:
raise ValueError
else:
raise TypeError
self._area = None
self._girth = None
@property
def length(self):
return self._length
@length.setter
def length(self, value):
if isinstance(value, int):
if value > 0:
self._length = value
else:
raise ValueError
else:
raise TypeError
@property
def width(self):
return self._width
@width.setter
def width(self, value):
if isinstance(value, int):
if value > 0:
self._width = value
else:
raise ValueError
else:
raise TypeError
@property
def area(self):
return self.length*self.width
@area.setter
def area(self, value):
raise WriteError
@property
def girth(self):
return self.length+2*self.width
@girth.setter
def girth(self, value):
raise WriteError
class WriteError(Exception):
def __str__(self):
return 'Read Only!'
rect1 = Rect(18, 20)
print(rect1.area, rect1.girth)
rect1.width = 30
rect1.length = 15
print(rect1.area, rect1.girth)
rect1.area = 300
四.类方法和静态方法
1.类中的函数
类中的方法分为:对象方法、类方法和静态方法
1)对象方法
a.声明:在类中直接声明
b.调用:用对象来调用
c.特点:表示当前对象的self参数,不用传参
d.适用场景:如果实现函数的功能需要用到对象属性时就使用对象方法
2)类方法
a.声明:在@classmethod后面声明
b.调用:用类来调用
c.特点:表示当前类的cls参数,不用传参(对象调用类方法时,cls指向该对象对应的类)
d.适用场景:如果实现函数的功能不需要对象属性,但需要类的字段,就使用类方法
3)静态方法
a.声明:在@staticmethod后声明
b.调用:用类来调用
c.特点:没有默认参数
d.适用场景:如果实现函数的功能既不需要类也不需要对象,就使用静态方法
class Person:
num = 61
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def eat(self, food):
return '%s正在吃%s' % (self.name, food)
@classmethod
def func(cls):
return '类方法'
@staticmethod
def func1():
return '静态方法'
五.继承
1.什么是继承
让子类直接拥有父类的属性和方法
子类 - 继承者
父类/超类 - 被继承者
2.怎么继承
1)语法
class 类名(父类1, 父类2,...):
说明文档
类的内容
2)说明
() - 固定写法,如果省略相当于(object),默认继承object(基类)
父类 - 一个类的父类可以有多个,但一般情况下继承一个(python支持多继承)
3.super()
1)对父类的方法增加功能
在子类中可以使用'super().方法名'调用父类中的对象方法及类方法
2)在父类的对象属性上增加其他属性
使用super().init调用父类的对象属性