1. 內(nèi)置類屬性
"""__author__ = Percy"""
"""
內(nèi)置類屬性:Python中每個(gè)類都擁有內(nèi)置的類屬性
__name__
__doc__
__dict__
__module__
__bases__
"""
class Animal:
"""動(dòng)物類"""
pass
class Cat(Animal):
"""貓類"""
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_number(cls):
print('貓的數(shù)量:%d' % cls.number)
if __name__ == '__main__':
cat1 = Cat('小花', 'white')
"""
1. 類.__name__
獲取類的名字(字符串)
"""
print(Cat.__name__)
"""
2.類.__doc__
獲取類的說明文檔
"""
print(Cat.__doc__)
"""
(重點(diǎn)) 3. 類.__dict__ 獲取類中所有的類屬性和對(duì)應(yīng)的值,以鍵值對(duì)的形式存到字典中
對(duì)象.__dict__ 將對(duì)象的屬性和對(duì)應(yīng)的值,轉(zhuǎn)換成字典的元素(常用)
"""
print(Cat.__dict__)
print(cat1.__dict__)
"""
4. 類.__module__ 獲取當(dāng)前類所在的模塊的名字
"""
print(Cat.__module__)
"""
5. 類.__bases__
獲取當(dāng)前類的父類
"""
print(Cat.__bases__)
運(yùn)行結(jié)果:
Cat
貓類
{'__module__': '__main__', '__doc__': '貓類', 'number': 0, '__init__': <function Cat.__init__ at 0x000001C7792DB510>, 'run': <function Cat.run at 0x000001C7792DB598>, 'shout': <staticmethod object at 0x000001C7792E34A8>, 'get_number': <classmethod object at 0x000001C7792E34E0>}
{'name': '小花', 'color': 'white'}
__main__
(<class '__main__.Animal'>,)
2. 私有化
python中類中的屬性和方法的私有化:直接在屬性名或者方法名前加__(命名以 '__' 開頭)
屬性或者方法私有:在外部不能直接使用,可以在類的內(nèi)部使用
import random
class Person:
"""人類"""
# 私有的類字段
__number = 10
def __init__(self, name='', age=0):
self.name = name
self.__age = age
def show_age(self):
print('%d' % (self.__age - 10))
self.__run()
# 私有的對(duì)象方法,只能在類的內(nèi)部調(diào)用
def __run(self):
print('%s在跑' % self.name)
# 私有的類方法(靜態(tài)也可以)
@classmethod
def get_number(cls):
print(cls.__number)
class Student:
def __init__(self, name):
self.name = name
self.study_id = ''
def __creat_id(self):
return 'py1805' + str(random.randint(1, 50)).rjust(3, '0')
def creat(self, name):
stu = Student(name)
stu.study_id = self.__creat_id()
return stu
if __name__ == '__main__':
p1 = Person('Percy', 18)
p1.name = 'Smile'
print(p1.name)
p1.show_age()
Person.get_number()
# 私有化原理:在內(nèi)部私有的名字前面加了前綴'__類名'
運(yùn)行結(jié)果:
Smile
8
Smile在跑
10
3. getter和setter
屬性假的私有化:聲明對(duì)象屬性的時(shí)候,在屬性名前面加一個(gè)'_',來告訴別人這個(gè)屬性不可以直接使用。
要通過getter和setter來獲取屬性的值和修改屬性的值
- getter:
格式:
@property
def 屬性名(去掉下劃線)(self):
return 返回值
如果在獲取對(duì)象的某個(gè)屬性前需要再干點(diǎn)別的事,就給屬性添加getter
- setter:給屬性賦值
一個(gè)屬性必須要有g(shù)etter才能添加setter。
格式:
@屬性名(去掉下劃線).setter
def 屬性名去掉下劃線(self, 變量名):
給帶下劃線的屬性賦值
如果在給對(duì)象的某個(gè)屬性賦值前需要再干點(diǎn)別的事,就給屬性添加setter
class Student:
"""學(xué)生類"""
def __init__(self):
# 聲明屬性的時(shí)候,前面加一個(gè)'_'是為了告訴別人這個(gè)屬性不能直接使用
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):
self._name = value
# 給_score添加getter和setter
@property
def score(self):
return self._score
@score.setter
def score(self, score):
self._score = score
# 給_age添加getter和setter
@property
def age(self):
return str(self._age) + '歲'
@age.setter
def age(self, age):
if age >=150 or age <= 0:
print('年齡輸入有誤')
# # raise 拋出異常:raise 錯(cuò)誤類型
# raise ValueError
self._age = None
return
self._age = age
if __name__ == '__main__':
stu1 = Student()
# 不添加getter和setter
# stu1._name = 'Percy'
# print(stu1._name)
# 添加getter和setter
stu1.name = 'Smile'
print(stu1.name)
stu1.score = 100
print(stu1.score)
stu1.age = 18
print(stu1.age)
stu1.age = 1000
print(stu1.age)
輸出結(jié)果:
Smile
100
18歲
年齡輸入有誤
None歲
4. 練習(xí)
"""__author__ = Percy"""
import json
def download_data():
with open('./data.json', 'r', encoding='utf-8')as f:
content = json.load(f)
return content['data']
class Data:
"""數(shù)據(jù)類"""
def __init__(self):
self.type = ''
self.text = ''
self.user_id = ''
self.name = ''
self.screen_name = ''
self._width = 0
self._height = 0
self._themes = None
# _width的getter和setter
@property
def width(self):
return self._width
@width.setter
def width(self, width):
self._width = int(width)
# _height的getter和setter
@property
def height(self):
return self._height
@height.setter
def height(self, height):
self._width = int(height)
# themes的getter
@property
def themes(self):
if not self._themes:
return '無'
return self._themes
# 根據(jù)字典創(chuàng)建對(duì)象
@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
data.__setattr__(key, dict1[key])
return data
if __name__ == '__main__':
print(download_data())
datas = []
for dict1 in download_data():
# 通過字典創(chuàng)建對(duì)象
data = Data.creat_data(dict1)
# 將創(chuàng)建的對(duì)象存起來
datas.append(data)
print(datas[0].width)
[{'type': '41', 'text': '胡蘿卜造型的可愛多功能雨傘,了解一下', 'user_id': '21088861', 'name': '蒙面女俠Y', 'screen_name': '蒙面女俠Y', 'width': '360', 'height': '636', 'themes': None}, {'type': '41', 'text': '水陸兩棲,自由變換,還不快來圍觀一下嗎!', 'user_id': '15262111', 'name': '共醉江湖', 'screen_name': '共醉江湖', 'width': '1024', 'height': '576', 'themes': None}]
636
5. 類的繼承
子類:繼承者
父類(超類):被繼承者
- 怎么繼承
python中類是可以繼承的,并且支持多繼承
class 類名(父類列表):
'''類的說明文檔'''
屬性
方法
說明:python中所有的類默認(rèn)繼承python的基類:object
- 能繼承哪些內(nèi)容
繼承:直接擁有父類的屬性和方法(繼承后父類的屬性和方法還是存在的)
a. 對(duì)象的屬性和方法、類的字段和類方法、靜態(tài)方法都可以繼承(私有的繼承無意義 --- 不能繼承)
b.__slots__的值不會(huì)被繼承
c. getter和setter會(huì)被繼承
class Person:
"""人類"""
__slots__ = ('name', 'age', 'sex', '__length', '_face')
def __init__(self):
self.name = ''
self.age = 0
self.sex = '男'
self.__length = 0
self._face = 0
def eat(self):
print('%s在吃飯' % self.name)
number = 61
@classmethod
def get_number(cls):
print('人的數(shù)量:%d' % cls.number)
@staticmethod
def hurt_earth():
print('人類破壞地球')
class Student(Person):
"""學(xué)生類"""
pass
if __name__ == '__main__':
p1 = Person()
stu = Student()
stu.name = 'Percy'
print(stu.name, stu.age, stu.sex)
stu.eat()
print(stu.__dict__)
print(stu._face)
print(Student.number)
Student.get_number()
Student.hurt_earth()
運(yùn)行結(jié)果:
Percy 0 男
Percy在吃飯
{}
0
61
人的數(shù)量:61
人類破壞地球