方法
种类:普通方法,类方法,静态方法,魔术方法
1.普通方法格式:
def 方法名(self[,参数,参数]):
pass
函数和方法的区别:
类里面定义的就是方法,用法和函数是一模一样的
单独定义的就是函数
1 # 关于self 2 class Phone: 3 brand = 'huawei' 4 type = 'mate 30' 5 6 # Phone类里面的方法:call 7 def call(self): 8 print('self------->', self) 9 print('正在打电话') 10 11 12 phone1 = Phone() 13 print(phone1, '------1------') 14 phone1.call()
可以看到 self就是当前phone1对象本身
1 # 关于self 2 class Phone: 3 brand = 'huawei' 4 type = 'mate 30' 5 6 # Phone类里面的方法:call 7 def call(self): 8 print('self------->', self) 9 print('正在打电话') 10 print(self.note) 11 12 13 phone1 = Phone() 14 print(phone1, '------1------') 15 phone1.note = "我是phone1的note" 16 phone1.call() # call(phone1) ----> self.note 17 18 print("=" * 30) 19 20 phone2 = Phone() 21 print(phone2, '------2------') 22 phone2.note = "我是phone2的note......" 23 phone2.call() # call(phone2) ----> self.note
可以看到不同的对象调用call(),call中的self,就会变成相应的对象本身
关于self的几点说明:
(1)self在对象的方法中表示当前对象本身,如果通过对象调用一个方法,那么该对象会自动传入到当前方法的第一个参数中
(2)self并不是关键字,只是一个用于接受对象的普通参数,理论上可以用任何一个普通变量名代替
(3)方法中有self形参
2.init方法
怎么解决这样的问题呢?保证每个self中都有这样的price
首先来看这个语句p = Phone()执行背后的步骤:
1.找有没有一块空间是Phone
2.利用Phone类,向内存申请一块跟Phone一样的空间,如:0x78394NAB
3.去Phone中找有没有__init__(),如果没有则执行将开辟内存给对象名:p
4.如果有__init__,则会进入init方法,执行里面的动作,再之后,将内存地址赋值给对象p
因此,每次创建对象的时候,系统会默认执行__init__()方法
1 class Phone: 2 # 系统的魔术方法之一,魔术方法的形式:__名字__() 3 def __init__(self): # init 初始的 初始化 4 print("init------") 5 self.brand = 'huawei' 6 self.price = 4999 7 8 def call(self): 9 print('------->call') 10 print('价格:', self.price) # 不能保证每个self中都存在price 11 12 13 p = Phone() # 只要创建对象,系统会默认执行__init__()方法 14 p.call() 15 16 p1 = Phone() 17 p1.call()
输出:
通过__init__()保证每一个类创建的对象中(模型造出来的空间)里面肯定有brand和price的两个属性
注意:类中是没有这两个属性的
因此,每次可以动态给对象添加属性
如果我想改变brand,或者price属性的值,就可以直接p1.price = 5999,这样动态修改了
3.给init方法中传参数
1 class Person: 2 name = '张三' 3 4 def __init__(self, name, age): 5 self.name = name 6 self.age = age 7 8 def eat(self, food): 9 print('{}正在吃{}'.format(self.name, food)) 10 11 12 p = Person('李四', 14) 13 p.eat('猪肉')
输出:李四正在吃猪肉