一、说明
__init__方法用来为对象定制自己独有的特征
二、示例代码如下
1 class LuffyStudent(): 2 school = 'luffycity' 3 4 def __init__(self, name, sex, age): 5 self.Name = name 6 self.Sex = sex 7 self.Age = age 8 9 def learn(self): 10 print('is learning') 11 12 def eat(self): 13 print('is eating') 14 15 def sleep(self): 16 print('is sleeping')
产生对象代码如下:
1 stu1 = LuffyStudent('王一丫', '女', 18) # 相当于LuffyStudent.__init__(stu1,'王一丫','女',18)
加上__init__方法后,类示例化的步骤如下:
1、先产生一个空对象,stu1
2、LuffyStudent.__init__(stu1,'王一丫','女',18)
查看stu1的名称空间:
1 print(stu1.__dict__)
结果如下:
{'Name': '王一丫', 'Sex': '女', 'Age': 18}
这就显示为对象定制了自己独有的特征
三、查看对象的数据属性,代码如下:
1 print(stu1.Name) 2 print(stu1.Sex) 3 print(stu1.Age)
结果如下:
王一丫
女
18
四、更改对象的数据属性,代码如下:
1 stu1.Name = '李一丫' 2 print(stu1.Name)
结果如下:
李一丫
五、删除对象的数据属性,代码如下:
1 del stu1.Name 2 print(stu1.__dict__)
结果如下:
{'Sex': '女', 'Age': 18}
六、增加对象的数据属性,代码如下:
1 stu1.class_name = 'python开发' 2 print(stu1.__dict__)
结果如下:
{'Sex': '女', 'Age': 18, 'class_name': 'python开发'}
七、属性查找
首先查看产生的每个对象的名称空间,示例代码如下:
1 class LuffyStudent(): 2 school = 'luffycity' 3 4 def __init__(self, name, sex, age): 5 self.Name = name 6 self.Sex = sex 7 self.Age = age 8 9 def learn(self): 10 print('is learning') 11 12 def eat(self): 13 print('is eating') 14 15 def sleep(self): 16 print('is sleeping') 17 18 stu1 = LuffyStudent('王一丫', '女', 18) 19 stu2 = LuffyStudent('王二丫', '男', 28) 20 stu3 = LuffyStudent('王三丫', '男', 38) 21 22 print(stu1.__dict__) 23 print(stu2.__dict__) 24 print(stu3.__dict__)
结果如下:
{'Name': '王一丫', 'Sex': '女', 'Age': 18}
{'Name': '王二丫', 'Sex': '男', 'Age': 28}
{'Name': '王三丫', 'Sex': '男', 'Age': 38}
类中的数据属性: 是所有对象共有的
示例代码如下:
1 print(LuffyStudent.school) 2 print(stu1.school) 3 print(stu2.school) 4 print(stu3.school)
结果如下:
luffycity
luffycity
luffycity
luffycity
都能够访问类中的数据属性,school
1 print(LuffyStudent.school, id(LuffyStudent.school)) 2 print(stu1.school, id(stu1.school)) 3 print(stu2.school, id(stu2.school)) 4 print(stu3.school, id(stu3.school))
结果:
luffycity 3016506040048
luffycity 3016506040048
luffycity 3016506040048
luffycity 3016506040048
从以上结果可以看出,访问的是同一块内存地址
八、类中的函数属性:是绑定给对象,绑定到不同的对象是使用不同的绑定方法
从以下代码和结果可以看出,代码如下:
1 print(LuffyStudent.learn) 2 print(stu1.learn) 3 print(stu2.learn) 4 print(stu3.learn)
结果如下:
<function LuffyStudent.learn at 0x000001764D5DB730>
<bound method LuffyStudent.learn of <__main__.LuffyStudent object at 0x000001764D5DE160>>
<bound method LuffyStudent.learn of <__main__.LuffyStudent object at 0x000001764D5DE1D0>>
<bound method LuffyStudent.learn of <__main__.LuffyStudent object at 0x000001764D5DE208>>
1 def learn(self): 2 print('%s is learning' % self.Name) 3 4 LuffyStudent.learn(stu1) 5 LuffyStudent.learn(stu2) 6 LuffyStudent.learn(stu3)
以上代码输出结果为:
王一丫 is learning
王二丫 is learning
王三丫 is learning
会自动把对象自身传入
稍作更改代码后如下所示:
1 def learn(self, x): 2 print('%s is learning %s' % (self.Name, x)) 3 4 stu1.learn(1) 5 stu2.learn(2) 6 stu3.learn(3)
结果如下:
王一丫 is learning 1
王二丫 is learning 2
王三丫 is learning 3
属性查找范围,会先从从类中查找,然后又从父类中查找,依次往上查找,但不会从全局变量中查找,代码验证如下:
1 LuffyStudent.x = 'from Luffycity class' 2 print(stu1.__dict__) 3 print(stu1.x)
验证结果:
{'Name': '王一丫', 'Sex': '女', 'Age': 18}
from Luffycity class
把1 LuffyStudent.x = 'from Luffycity class' 这行代码注释后,
再执行就会报错,AttributeError: 'LuffyStudent' object has no attribute 'x'