调用类方法时,类名带括号和不带括号的区别
终于弄明白了
类
类的定义
class定义类,与函数的定义def相似,空格跟类名
类名一般都是首字母大写,“驼峰命名法”,首个单词字母大写。
类名后面可以加括号,也可以不加,默认都是继承object类。
变量名,都是小写。单词之间下划线隔开
python中类的定义语法如下:
class 类名: pass
类的三要素:①类名②属性---变量 ③方法---函数
类属性:定义在类方法之外
类方法:类中定义的函数
类属性的访问:类名.属性名
类方法的调用:类名.方法名
注意:(重点)
实例对象可以访问类属性
实例属性有独立内存空间
类不能访问实例属性
类不能访问实例方法(实例方法名后带(self))
实例对象不能访问类方法(类方法名后面只有空括号())
示例 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | class Teacher: name = "鲁班" # 类属性 def age(): print ( '我要上王者' ) Teacher.name = "李白" # 改变类的属性 Teacher.name2 = '典韦' # 类外--添加类属性 print (Teacher.name2) t = Teacher() # 创建一个Teacher()的实例t Teacher.age() # 调用Teacher类的方法 print (Teacher.name) # 调用Teacher类的属性 print (t.name) #实例对象可以访问类属性 #t.age() #错误 实例对象不能访问类方法 print ( 'Teachar.name的id:%d' % id (Teacher.name)) print ( 't.name为改变前的id:%d' % id (t.name)) t.name = "妲己" print ( 't.name改变后的id:%d' % id (t.name)) 执行结果: 典韦 我要上王者 李白 李白 Teachar.name的 id : 2756328801008 t.name为改变前的 id : 2756328801008 t.name改变后的 id : 2756328801184 |
类的实例化
实例化是由抽象到具体的过程
定义:实例名 = 类名()
类是实例的工厂,类提供的是母版
实例是一个独立存放变量的空间
例如:
1 class Car: 2 boon = 4 3 audi = Car() # 实例化出来的对象 4 bmw = Car() 5 audi.boon = 5 #对象添加的属性,空间是独立的,其他的访问不到 6 print(audi.boon) 7 print(bmw.boon) 8 9 执行结果: 10 5 11 4
方法
封装在类里的一种特殊的函数
示例:
1 class Hero: 2 name = '鲁班' 3 def run(self): # self 就是一个参数 代表 实例本身 约定俗成self 4 print('五连绝世') 5 6 str = Hero() # 实例化对象 7 str.run() # ok 实例化调用方法 8 Hero.run(str) 9 #Hero.run() #错误 类不能调用实例方法 10 print('%s拿了五杀'%str.name) 11 print('%s拿了五杀'%Hero.name) 12 13 执行结果: 14 五连绝世 15 五连绝世 16 鲁班拿了五杀 17 鲁班拿了五杀
这里有了个问题,加了self有什么作用?
self:代表实例本身 ,加了self代表实例方法,没self代表类方法
了解:魔法方法
dir(对象) 查看对象所有的魔法方法
带两个下划线的 叫做魔法方法 有特殊的作用 它们的调用时由python解释器去调用的每一个方法调用的时机都是不一样的 不需要手动调用。
构造方法
初始化
以双下划线开头且以双下划线结尾的固定方法,他们会在特定的时机被触发执行,__init__就是其中之一,它会在实例化之后自动被调用,以完成实例的初始化。
示例:
1 class Hero: 2 def __init__(self,name): #两个下划线,初始化方法 3 self.name = name 4 def state(self): #在Hero类中定义state方法 5 print('%s又没了'%self.name) #调用实例wum的name属性 6 7 wum = Hero('鲁班') #实例化时需要传一个参数 8 wum.state() #调用state方法 9 10 执行结果: 11 鲁班又没了
init参数传递过程:
实例化产生一个类的实例—>python自动调用实例.init(参数)—>转换为类.init(实例,参数)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示