1.内置类属性
python中每个类都用有的内置类属性
name:获取类的名字
doc:获取类的说明文档
dict:
对象.dict
将对象的属性和对应的值,转换成字典的元素(常用,记住)
注意:当我们通过slots去约束对象的属性后,对象dict属性不能使用。
类.dict
获取类中所有的类属性和对应的值,一键值对的形式
存到字典中
module:获取当前类所在模块的名字
bases:获取当前类的父类,结果是元组
class Cat:
'''猫类'''
number=0
def __init__(self,name='',color=''):
self.name=name
self.color=color
def run(self):
print('%s在跑'% self.name)
@staticmethod
def shout():
print('喵~')
@classmethod
def get_numbers(cls):
print('猫的数量:%d'% cls.number)
if __name__ == '__main__':
cat1=Cat('小花','white')
cat1 = Cat('小人', 'black')
'''
1.__name__
获取类的名字
'''
print(Cat.__name__)
'''
2.类__doc__
获取类的说明文档
'''
print(Cat.__doc__)
'''
3.__dict__
对象.dict
将对象的属性和对应的值,转换成字典的元素(常用,记住)
类.dict
获取类中所有的类属性和对应的值,一键值对的形式
存到字典中
'''
print(Cat.__dict__)
print(cat1.__dict__)
'''
4.类.__module__
获取当前类所在模块的名字
'''
print(Cat.__module__)
'''
5.类.__bases__
获取当前类的父类,结果是元组
'''
print(Cat.__bases__)
Cat
猫类
{'module': 'main', 'doc': '猫类', 'number': 0, 'init':init at 0x000002B19A7FA8C8>, 'run': , 'shout': , 'get_numbers': , 'dict': dict' of 'Cat' objects>, 'weakref': weakref' of 'Cat' objects>}
{'name': '小人', 'color': 'black'}
main
(,)
2.私有化
- python中类中的属性和方法的私有化:直接在属性名或者方法名前加__
(命名以'__'开头) - 属性或者方法私有:在外部不能直接使用,可以在类的内部使用
*私有化的原理:在内部私有化的名字前面加了前缀'__'
class Person:
# 私有类字段
__number=61
def __init__(self,name='',age=0):
self.name=name
self.__age=age
def show_age(self):
print('%d'% (self.__age-10))
self.__run()
#私有的对象方法,只能在类的内部使用
def __run(self):
print('%s在跑'% self.name)
# 私有的类方法
@classmethod
def __get_number(cls):
print(cls.__number)
import random
class Student:
def __init__(self,name):
self.name=name
self.study_id=''
@classmethod
def __creat_id(cls): 'py1805'+str(random.randint(1,50)).rjust(3,'0')
@classmethod
def creat(cls,name):
stu= Student(name) stu.study_id=cls.__creat_id()
return stu
if __name__ == '__main__':
p1=Person('张三',30)
p1.name='李四'
p1.__age=34
# print(p1.name,p1.age)
p1.show_age()
# p1.run()
# Person.get_number()
print(p1.__dict__)
结果:
20
李四在跑
{'name': '李四', '_Person__age': 30, '__age': 34}
3.getter和setter
属性假的私有化:声明对象属性的时候,在属性名前面加一个'_',来告诉别人这个属性不可以直接使用。要通过getter和setter来获取属性的值和修改属性的值
1)getter
- getter:获取属性的值
- 格式:
@property
def 属性名(去掉下划线)(self)
return 返回值
如果在获取对象的某个属性前需要干的别的事情,就给属性添加getter
2)setter
*setter:给属性赋值,一个属性必须要有getter,才能添加setter。
*格式:
@属性.setter
def 属性(去掉下划线)(self,变量名)
self.属性=变量名
如果在给对象的某个属性赋值前需要干的别的事情,就给属性添加setter
class Student:
'''学生类'''
def __init__(self):
# 声明属性的时候,前面加一个'_',表明是个假私有,别
# 人不能直接使用
self._name=''
self._score=0
self._age=0
# 给属性_name添加getter
@property
def name(self):
return self._name
# 给属性_name听见setter
@name.setter
def name(self,value):
stu1._name=value
@property
def age(self):
return str(self._age)+'岁'
@ age.setter
def age(self,age):
if age>=150 or age<0:
print('输入有误,age要求0-150的值')
# raise ValueError #抛出异常
self._age=None
return
self._age = age
@property
def score(self):
return self._score
@score.setter
def score(self,score):
self._score=score
if __name__ == '__main__':
stu1=Student()
stu1._name='张三'
stu1._score=80
stu1.name='李四'
print(stu1.name)
stu1.age=100
print(stu1.age)
结果:
李四
100岁
练习:
import json
class Dict:
def __init__(self):
self._type=''
self.text=''
self.user_id=''
self.name=''
self.screen_name=''
self._width=''
self._height=''
self._themes=''
@property
def width(self):
return self._width
@width.setter
def width(self,width):
if width.isnumeric():
self._width=int(width)
self._width=width
@property
def height(self):
return self._height
@height.setter
def height(self, height):
if height.isnumeric():
self._height = int(height)
self._height= height
@property
def themes(self):
if self._themes:
return self._themes
else:
return '无'
@themes.setter
def themes(self, themes):
self._themes = themes
@property
def type(self):
return self._type
@type.setter
def type(self, type):
if type.isnumeric():
self._type = int(type)
self._type = type
# 方法二:
@classmethod
def creat_data(cls,dict1):
# 返回一个对象
data=cls()
for key in dict1:
if key=='width':
data.width=dict1[key]
continue
if key=='height':
data.height=dict1[key]
continue
if key=='themes':
data.themes=dict1[key]
continue
if key=='type':
data.type=dict1[key]
continue
data.__setattr__(key,dict1[key])
return data
if __name__ == '__main__':
dict5=Dict()
dict4 = Dict()
with open('./data.json','r',encoding='utf-8') as f:
dict=json.load(f)
list1=dict['data']
dict2=list1[0]
dict3=list1[1]
# 方法-:
dict4.type=dict2['type']
dict4.text = dict2['text']
dict4.user_id =dict2['user_id']
dict4.name = dict2['name']
dict4.screen_name = dict2['screen_name']
dict4.width = dict2['width']
dict4.height = dict2['height']
dict4.themes = dict2['themes']
dict5.type = dict3['type']
dict5.text = dict3['text']
dict5.user_id = dict3['user_id']
dict5.name = dict3['name']
dict5.screen_name = dict3['screen_name']
dict5.width = dict3['width']
dict5.height = dict3['height']
dict5.themes = dict3['themes']
print(dict4.type,dict4.text,dict4.user_id,dict4.name,dict4.screen_name,dict4.width\
,dict4.height,dict4.themes)
print(dict5.type, dict5.text, dict5.user_id, dict5.name, dict5.screen_name, dict5.width \
, dict5.height, dict5.themes)
d=Dict()
datas=[]
# 方法二:
for dict1 in list1:
# 得到一个对象
data=d.creat_data(dict1)
# 返回对象列表
datas.append(data)
print(datas[1].type)
结果:
41 胡萝卜造型的可爱多功能雨伞,了解一下 21088861 蒙面女侠Y 蒙面女侠Y 360 636 无
41 水陆两栖,自由变换,还不快来围观一下吗! 15262111 共醉江湖 共醉江湖 1024 576 无
41
5.继承
子类:继承者
父类(超类):被继承者
1)基础
python中类是可以继承的,并且支持多继承
class 类名(父类):
"""类的说明文档"""
属性
方法
说明:python中所有的类默认继承python的基类:object
2)能继承哪些内容
继承:直接拥有父类的属性和方法(继承后父类的属性和方法还是存在的)
- 对象的属性和方法都可以继承 、类的字段、类的方法和静态方法都可以继承(私有的继承无意义-->可当做不能继承)
- slots的值不会被继承
- getter和setter会被继承
- 如果父类设置了slots,子类对象也不能使用dict
class Person:
'''人类'''
number=34
def __init__(self):
self.name=''
self.age=0
self.sex='男'
self.__length=0
self._len1 = 0
@property
def len1(self):
return self._len1
@len1.setter
def len1(self,len1):
self._len1=len1
def eat(self):
print('%s在吃饭'% self.name)
@classmethod
def get_number(cls):
print('有%d人'% cls.number)
@staticmethod
def hurt_earth():
print('人类破坏地球')
class Student(Person):
'''学生类'''
pass
if __name__ == '__main__':
stu=Student()
stu.name='小明'
stu.eat()
print(stu.name,stu.age)
print(stu.number)
stu.get_number()
stu.hurt_earth()
print(stu.__dict__)
stu.len1=100
print(stu.len1)
结果:
小明在吃饭
小明 0
34
有34人
人类破坏地球
{'name': '小明', 'age': 0, 'sex': '男', '_Person__length': 0, '_len1': 0}
100