当调用一个对象的属性时,解析器会先在当前对象中寻找是否含有该属性,如果有则直接返回当前对象的属性值;如果没有,则去当前类对象当中寻找。如果类对象中没有,则报错。
即:实例化对象先找自己属性,自己不存在再找类对象,类对象没有则报错。
- (2)类对象和实例对象都可以保存属性(方法)
果属性和方法是所有势力所共享的,则应该保存到类对象中;如果属性和方法是某个实例所独有的,则应该保存到相应的实例对象中。一般情况下,属性保存到实例对象当中,方法则保存到类对象当中。
2. self参数
在类中,方法每次调用时解析器会自动传递一个实参;
如果是实例化对象p1调用,则第一个参数就是p1对象
如果是实例化对象p2调用,则第一个参数就是p2对象
一般我们都会将这个对象命名为self。
class person:
name='葫芦娃'
def speak():
print('你好,我是%s'%self.name)
#创建实例
p1=person()
p2=person()
p1.name='钢铁侠'
p2.name='蜘蛛侠'
p1.speak()
p2.speak()
你好,我是钢铁侠
你好,我是蜘蛛侠
3. 特殊方法
出问题:
(1) name属性时必须的
(2) name属性是不同的
(3) 手动添加实例化对象属性值的时候容易出错
在类中定义特殊方法,该方法都是以双下划线开头 双下划线结尾: init
特殊方法不需要我们自己调用,
特殊方法会在特殊时自己调用特殊方法。如果类中有类属性,则优先执行类属性,在执行特殊方法。
class person:
def __init__(self,name):
self.name=name
def speak(self):
print('你好,我是%s'%self.name)
p1=person('牛叉')#将属性放于实例对象中
p2=person('走你')
p1.speak()
p2.speak()
你好,我是牛叉
你好,我是走你
4. 总结
- 类的基本结构:
class 类名([父类]):
公共属性...
# 对象的初始化方法
def __init__(self,....):
....
# 其他的方法
def method1(self):
...
def method2(self):
...
实例化对象.....