码迷,mamicode.com
首页 > 其他好文 > 详细

第七章 面向对象(2):对象的使用

时间:2019-07-18 22:35:40      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:lock   sch   技能   初始化   不同   aaa   数据类型   初始   报错   

上一篇我们介绍了面向对象以及类,其中也有一些关于对象的概念。

简单的说,对象就是特征与技能的结合体。

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的方法
  • 小注意:
  1. 站在不同的角度定义出的类是不同的。
  2. 现实中的类并不完全等于程序中的类,比如现实中的公司类,在程序中优势需要拆分成部门类,业务类等
  3. 有事为了编程需求,程序中也可能定义现实中不存在的类,比如策略类,现实中并不存在,但在程序中确实很常见的类

面向对象的好处

可扩展性高,在以后的知识点里,继承,封装等都会介绍

第七章 面向对象(2):对象的使用

标签:lock   sch   技能   初始化   不同   aaa   数据类型   初始   报错   

原文地址:https://www.cnblogs.com/py-xiaoqiang/p/11210404.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!