类的相关知识
'''
1.数据属性
2.函数属性
'''
class Car:
'这是一个车的类'
Brand='NISSAN'
def Drift():
print('漂移完成了一个漂亮的过弯')
def Brake(self):
print('完成了一个完美的刹车')
print(dir(Car))#属性名查询,以列表形式存放print(Car.__dict__)#查看类的属性字典,数据属性和函数属性都放在字典中,以字典形式存的键值对,可以通过映射来直接调用
#调用
print(Car.Brand)
print(Car.__dict__['Brand'])#调用数据其实就是从属性字典中拿
Car.Drift()
Car.__dict__['Drift']()#调用方法其实就是从属性字典中拿
Car.Brake(496)
Car.__dict__['Brake'](496)#调用方法其实就是从属性字典中拿#类的特殊属性
print(Car.__name__)#类的名字(字符串)
print(Car.__doc__)#类的文档字符串
print(Car.__base__)#类的第一个父类(继承时详解)
print(Car.__bases__)#类的负累构成的元祖(继承时详解)
print(Car.__dict__)#类的属性
print(Car.__module__)#类定义所在的模块
print(Car.__class__)#实例对应的类(仅新式类中)
输出结果:
对象的相关知识
'''
class Car:
'这是一个车的类'
Brand='NISSAN'
def init(name,length,weight):
dic={
'name':name,
'length':length,
'weight':weight
}
return dic
def Drift():
print('漂移完成了一个漂亮的过弯')
def Brake(self):
print('完成了一个完美的刹车')
return init(name,length,weight)返回的s1=Car('尼桑',4,1500)
思路上:定义一个init的函数,写上初始化的属性,类返回一个init,Init中再返回一个字典。
理想效果:传入参数,完成执行,但语法上这样是不支持的,需要用到__init__,如下:
''' class Car: '这是一个车的类' Brand='NISSAN' def __init__(name,length,weight): dic={ 'name':name, 'length':length, 'weight':weight } return dic def Drift(): print('漂移完成了一个漂亮的过弯') def Brake(self): print('完成了一个完美的刹车') s1=Car('尼桑',4,1500) '''
使用__init__不需要再return,自动会返回一个字典
最终效果:
class Car:
'这是一个车的类'
Brand='NISSAN'
def __init__(self,name,length,weight):
print('我开始运行了')
self.mingzi=name
self.changdu=length
self.zhongliang=weight
print('我运行结束了')
def Drift():
print('漂移完成了一个漂亮的过弯')
def Brake(self):
print('%s 完成了一个完美的刹车' %self.mingzi)
s1=Car('尼桑',4,1500) #--> __init__(self,name,length,weight)也就是执行
print(s1.__dict__)
s1.Brake()#先是从局部作用域自己的init里面找,找不到再到上一层大类中找,再找不到就报错
print(s1.mingzi)#就是从字典中拿,-->s1.__dict__['mingzi']
Car.Brake(s1)
输出结果如下:
s1=Car() 触发__init__()方法
所以需要3个参数:'尼桑',4,1500
self.mingzi=name相当于s1.mingzi=name
self.changdu=length相当于s1.changdu=length
self.zhongliang=weight相当于s1.zhongliang=weight
实例化就是__init__函数的执行,所以s1.__dict__返回的字典也不会有函数属性:
{'mingzi': '尼桑', 'changdu': 4, 'zhongliang': 1500}
调用数据属性:s1.mingzi
调用函数属性:Car.Brake(s1)或者s1.Brake()#自动传入s1本身==self
多个实例中,只保存数据属性,而函数属性都在类中去找,这样的设计是非常必要的,对内存的节省
类属性增删改查
def test(self):
print('test')
Car.Drift=test
s1.Drift()
增加:Car.country='word'
删除:del Car.country
修改:Car.Brand='GTR'
修改函数名:Car.piaoyi=Drift
修改函数方法,需要先创建一个方法,再替换:
def test(self):
print("test")
#把Drift方法改为test方法:
Car.Drift=test
查看:print(Car.Brand)
实例属性增删改查
class Car:
'这是一个车的类'
Brand='NISSAN'
def __init__(self,name,length,weight):
print('我开始运行了')
self.mingzi=name
self.changdu=length
self.zhongliang=weight
print('我运行结束了')
def Drift():
print('漂移完成了一个漂亮的过弯')
def Brake(self):
print('%s 完成了一个完美的刹车' %self.mingzi)
s1=Car('尼桑',4,1500)
查看:s1.mingzi数据查看
s1.Brake方法查看
增加:s1.height=1.5数据属性增加
实例函数属性增加:
def test2(self):
print("多余")
s1.test2=test2
s1.test2(s1)
修改:s1.mingzi='奥拓'
删除:del s1.mingzi
不是.调用,则与类无关,注意如果实例init中没有属性,类中有该属性,使用s1.属性名.append(‘s’)则是在类中属性增加s,如果实例Init中已有该属性,则修改先修改实例化中属性,类属性无变化,只有是实例化调用都优先从init中查找
country='美国'
class Car:
country='中国'
l=[1,2,3]
def __init__(self,name):
self.country="重庆"
print('直接打印:',country)
print('通过.类名调用:',Car.country)
print("通过.实例调用:",self.country)
s1=Car('lee')
#s1.l=[2,2,3]
print(Car.__dict__)
print(s1.__dict__)
s1.l.append('s')
print(s1.__dict__)
print(Car.__dict__)
输出结果: