上一篇我们介绍了面向对象以及类,其中也有一些关于对象的概念。
简单的说,对象就是特征与技能的结合体。
7.3.1 __init__方法
__init__方法用来为对象指定对象自己独有的特性。(初始化方法)
class Student:
school = 'aaa' # 变量又称-类的数据属性
def __init__(self, name, sex, age): # 实例化的时候就会调用__init__方法
self.Name = name # 把参数传入实例化的对象 (python 大小写区分)
self.Sex = sex # 把参数传入实例化的对象
self.Age = age # 把参数传入实例化的对象
def learn(self): # 函数又称-类的函数属性
print('learning')
def eat(self):
print('eating')
def sleep(self):
print('sleeping')
stu1 = Student('xiaoming', 'FM', 13) # 因为__init__方法有位置参数,所以初始化的时候必须给定参数,如果不给参数会报错
# 加上__init__方法后,实例化的步骤
# 1. 先产生一个空对象
# 2. 调用 Student.__init__(stu1, 'xiaoming', 'FM', 13)
# 传入的参数在stu1的命名空间中
# 查属性
print(stu1.__dict__) # 字典形式输出一下对象的属性
print(stu1.Name)
print(stu1.Sex)
print(stu1.Age)
# 改
stu1.Name = 'xiaowang'
print(stu1.__dict__)
print(stu1.Name)
# 增
del stu1.Name
print(stu1.__dict__)
# 删
stu1.class_name = 'python dev'
print(stu1.__dict__)
# 实例化stu2
stu2 = Student('xiaoyu', 'FM', 11)
print(stu2.__dict__)
7.3.2 属性查找与绑定方法
相似的特征与技能(类固有数据属性和函数属性)保存在类中
- 类中的数据属性:是所有对象共有的
- 类中的函数属性:是绑定给对象的,绑定到不同的对象是不同的绑定方法。方法只作用于执行它的对象
class Student:
school = 'aaa' # 变量又称-类的数据属性
def __init__(self, name, sex, age): # 实例化的时候就会调用__init__方法
self.Name = name # 把参数传入实例化的对象 (python 大小写区分)
self.Sex = sex # 把参数传入实例化的对象
self.Age = age # 把参数传入实例化的对象
def learn(self): # 函数又称-类的函数属性
print('learning', self.Name)
def eat(self):
print('eating')
def sleep(self):
print('sleeping')
stu1 = Student('xiaoming', 'M', 13)
stu2 = Student('xiaowang', 'FM', 13)
stu3 = Student('xiaoliu', 'M', 11)
# 类中的数据属性:是所有对象共有的,保存在同一个内存地址中
print(Student.school, id(Student.school)) # 以下地址相同
print(stu1.school, id(stu1.school))
print(stu2.school, id(stu2.school))
print(stu3.school, id(stu3.school))
# 类中的函数属性:是绑定给对象的,绑定到不同的对象是不同的绑定方法。方法只作用于执行它的对象
print(Student.learn, id(Student.learn)) # 是function类型,一般函数
Student.learn(stu1) # 可以传入对象来执行,不传会报错
Student.learn(stu2) # 可以传入对象来执行
Student.learn(stu3) # 可以传入对象来执行
# 对象调用绑定方法时,会将对象本身当做第一个参数传入,传给self
print(stu1.learn, id(Student.learn)) # 内存地址不同,是bound method类型:绑定方法
print(stu2.learn, id(Student.learn)) # 内存地址不同,是bound method类型:绑定方法
print(stu3.learn, id(Student.learn)) # 内存地址不同,是bound method类型:绑定方法
# 输出例:<bound method Student.learn of <__main__.Student object at 0x000000000228D5F8>> 36087736
stu1.learn() # 相当于learn(stu1)
stu2.learn() # 相当于learn(stu2)
stu3.learn() # 相当于learn(stu3)
# stu3.learn(stu3) 如果再传入,会报错,说你传入了2个参数
# 当对象和类有同一个变量的时候,跟函数类似,先访问对象中>类中>父类,当父类中都没有,就会报错,不会去全局变量找。
stu1.x = 'xxx'
Student.x = 'XXXXXX'
print(stu1.x)
print(stu1.__dict__)
del stu1.x
print(stu1.x)
print(stu1.__dict__)
类中定义的函数实际上是给对象使用的,绑定对象使用
补充 python中一切皆对象
python中一切皆对象,并在在python3中统一了类与类型的概念。即数据类型也是一种类
print(type([1,2,3])) # 结果:<class 'list'> ,即是说 list其实是一个类
li = [1,2,3] # li = list([1,2,3])
li.append(2) # 这个append也是li的绑定方法
list.append(li, 2) # 这个其实就相当于,执行了类list的append的方法
- 小注意:
- 站在不同的角度定义出的类是不同的。
- 现实中的类并不完全等于程序中的类,比如现实中的公司类,在程序中优势需要拆分成部门类,业务类等
- 有事为了编程需求,程序中也可能定义现实中不存在的类,比如策略类,现实中并不存在,但在程序中确实很常见的类
面向对象的好处
可扩展性高,在以后的知识点里,继承,封装等都会介绍
原文地址:https://www.cnblogs.com/py-xiaoqiang/p/11210404.html
时间: 2024-11-10 00:43:56