类的相关知识

 

类的相关知识

'''
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__)

输出结果:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值