python之面向对象
admin
2023-07-18 10:02:25
0

1.定义一个类(开辟一个内存空间)

class Role(object):               #定义一个类, class是定义类的语法,Role是类名,(object)是新式类的写法
    n = 123                #类变量,(存在类的内存)
    name = "类变量"
    def __init__(self, name, role, weapon, life_value=100, money=1000):   #初始化方法(构造方法,构造函数)
        self.name = name        #实例变量(静态属性),实例变量的作用域就是实例本身(存在实例的内存)
        self.role = role
        self.weapon = weapon
        self.__life_value = life_value #life前面的两条下划线加上之后称作私有属性
        self.money = money

    def shot(self):             #类的方法、功能(动态属性)
        print("shooting...")

    def stat_life(self):
        print("name:%s,weapon:%s,lif_value:%s"%(self.name,self.weapon,self.__life_value))

    def got_shot(self):
        print("ah..., got shot...",self.name)

    def buy_gun(self, gun_name):
        print("%s just bought %s" %(self.name,gun_name))
        print("")

    def __del__(self):     #析构函数,在实例释放,销毁(如将实例del或者程序退出)的时候自动执行,不需要去调用,通常用于一些收尾工作,关闭一些数据库连接和打开的临时文件
        print("析构函数")

    def __my_test(self):
        print("私有方法")

    def my_test(self):
        self.__my_test()

●  __init__()叫做初始化方法(或构造方法), 在类被调用时,这个方法(虽然它是函数形式,但在类中就不叫函数了,叫方法)会自动执行,进行一些初始化的动作,所以这里写的__init__(self,name,role,weapon,life_value=100,money=1000)就是要在创建一个角色时给它设置这些属性。

●  self就是实例本身(r1或者r2...)!实例化时python会自动把这个实例本身通过self参数传进去。


2.实例化,把一个类变成具体对象的过程叫实例化

#print(Role)                             # 即使不实例化,这个Role类本身也已经存在内存里
r1 = Role("fxl","police","AK47")         #==>Role.__init__(r1,'fxl','police',’AK47’)
r2 = Role("cx","thief","Knife")          #==>Role.__init__(r2,'cx','thief',’Knife’)

●实例化具体过程

# 在内存中开辟一块空间指向r1这个变量名

# 调用Role这个类并执行其中的__init__(…)方法,相当于Role.__init__(r1,'fxl','police',’AK47’),这样是为了把'fxl','police',’AK47’这3个值跟刚开辟的r1关联起来,关联起来后,你就可以直接r1.name, r1.weapon 这样来调用。所以这个__init__(…)方法里的,self.name = name , self.role = role 会存到r1的内存空间里。

# 实例化其实就是以类Role为模版,在内存里新开辟一块空间,存上数据,赋值成一个变量名


3.调用实例中方法

print(r1.name)
r1.shot()
r1.buy_gun("AK47")           #python 会自动帮你转成 Role.buy_gun(r1,"AK47")


4.类变量和实例变量的区别

print(Role.n)           #不实例化也可以调用类变量
Role.n = 456            #修改类变量
print(Role.n)
print(r1.n,r1.name)     #在实例中也可以调用类变量,但是如果类变量中和实例变量中有相同变量名,会调用实例中的变量,如name,因为它会先在实例本身内存空间找,再去找类的内存空间找
print(r2.n,r2.name)

●  类变量作用:大家共用的属性,节省开销(如果全都使用实例变量,那么每实例化一个对象都会新开辟一个内存空间,当实例很多的时候就会消耗内存资源,而类变量只会在类的内存空间存储一次,每个实例都可以调用)。


6.对实例r1操作

r1.name = "FXL"             #修改实例r1的属性,对于r2没影响,因为实例化之后r1新开辟了一个内存空间
print(r1.name)
r1.test1 = "test1"          #给实例r1新增一个属性
print(r1.name,r1.test1)
del r1.test1                #删掉实例的属性
print(r1.test1)


7.私有方法和私有属性(属性<->变量):都是在方法或者属性前面加两条下划线__,如上的__life_value属性。变成私有属性或方法之后在外部不可直接调用

#print(r1.__life_value)              #对于__life_value属性,直接调用报错,显示没有这个属性
#print(r1.__my_test())               #对于__my_test方法,直接调用报错,显示没有这个属性
print(r1.stat_life())                #但是可以在类内部的方法中调用该属性,然后再去调用该方法
print(r1.my_test())                  #但是可以在类内部的方法中调用该方法,然后再去调用该方法

总结

●  上面的这个r1 = Role('Alex', 'police', 'AK47’)动作,叫做类的“实例化”, 就是把一个虚拟的抽象的类,通过这个动作,变成了一个具体的对象, 这个对象就叫做实例

●  刚才定义的这个类体现了面向对象的第一个基本特性,封装,其实就是使用构造方法将内容封装到某个具体对象中,然后通过对象直接或者self间接获取被封装的内容

问题在buy_gun(self, gun_name):等方法中为什么也要赋值给self这个参数?

●因为你在buy_gun(..)方法中可能要访问r1的一些其它属性, 比如这里就访问了r1的名字


相关内容

热门资讯

京哈铁路突发设备故障致多趟高铁... 极目新闻记者 柳琛琛6月13日晚,有乘客发文称,自己乘坐的G2621次列车遭遇较长时间的晚点。记者了...
维沃申请网络切换方法专利,提升... 国家知识产权局信息显示,维沃移动通信有限公司申请一项名为“网络切换方法、装置和电子设备”的专利,公开...
食品安全“互联网+AI”智慧监... 全市各食品生产经营单位: 民以食为天,食以安为先。当前,数字技术正深度融入社会治理,智慧监管是食品安...
风电油泵厂家梳理 新能源发电设... 导语:风电油泵作为新能源发电设备液压系统的核心元件,其性能直接影响设备运行稳定性与维护成本。基于20...
单机功率 105 兆瓦国际最大... 感谢IT之家网友 的线索投递! 6 月 13 日消息,据央视报道,由中储国能(北京)技术有限公司与卧...
印度油轮被美国揪着打,莫迪却“... 据《印度时报》昨天消息,在过去72小时内,印度外交部两次召见美国驻印度临时代办杰森·米克斯,6月10...
巴基斯坦总理推文,特朗普转发 美国总统特朗普13日在其“真实社交”媒体平台上转发巴基斯坦总理关于24小时内签署美伊和平协议可能性的...
印度暂停《印度河用水条约》,巴... 据凤凰卫视报道,印度水利部长帕蒂尔近期宣布,印度正全力推行总理莫迪的指示,确保未来几年内没有一滴水经...
马克龙要“救欧洲”,却猛打中国... 马克龙对华态度的两面性因主办星期一开始的G7峰会有了新发挥。法国把峰会主题定在了“讨论全球失衡”这一...
美顶尖经济学家劝斯威士兰“弃暗... 赖清德上月刚想尽办法窜访的所谓“邦交国”斯威士兰,传来一个剜他心的消息。斯威士兰新闻(Swazila...