python课堂整理33----面向对象(我的对象又在哪里)

Posted dabai123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python课堂整理33----面向对象(我的对象又在哪里)相关的知识,希望对你有一定的参考价值。

一、面向对象设计(Object Oriented Design)

将一类具体事物的数据和动作整合到一起,即面向对象设计

理解两个概念:

类:把一类事物的相同的特征和动作整合到一起就是类,类就是一个抽象的概念

对象:就是基于类而创建的一个具体的事物(具体存在的),也就是特征和动作整合到一起

例:

def people(gender,country):  #定义一个“人”的类
    def init(gender, country): #相当于初始化
        dir =                #人的特征和动作
            "gender":gender,
            "country": country,
            "eat": eat,
            "sleep":sleep
        
        return dir
    def eat(dir):
        print("%s %s正在吃饭"%(dir["country"], dir["gender"]))

    def sleep(dir):
        print("%s %s正在睡觉"%(dir["country"], dir["gender"]))
    return init(gender, country)

p1 = people("man", "China") #得到的是一个字典
p1["eat"](p1)               #通过字典取值调用函数,函数需要的参数在字典里
p2 = people("女人", "日本")
p2["sleep"](p2)

技术图片  

 二、面向对象编程(Object oriented Programming)

用定义类 + 实例/对象的方法去实现面向对象的设计

实例化:由类生产对象的过程叫实例化,类实例化的结果就是一个对象,或者叫做一个实例(实例 = 对象)

.....
class  类名 :
    ‘类的文档字符串‘
    类体
    
.....
    
class Chinese:
    ‘这是一个中国人的类‘
    pass

#实例化
p1 = Chinese() #就相当于函数的return返回的结果
print(p1)
#经典类
class  类名 :
    ‘类的文档字符串‘
    pass

#新式类
class 类名(object) :
    pass

在python2中,经典类和新式类不同,在python3中都归为新类

三、属性相关知识

1. 数据属性:就是变量

2. 函数属性:就是函数,在面向对象里通常称为方法

注意:类和对象均用点来访问自己的属性

class Chinese:
    ‘这是一个中国人的类‘
    dang = ‘gong chan党‘

print(Chinese.dang)

技术图片

class Chinese:
    ‘这是一个中国人的类‘
    dang = ‘gong chan党‘
    def helpp():
        print("一个人正在帮助老奶奶")
    def jump_queue(self):
        print("插到了前面")

print(Chinese.dang)
Chinese.helpp()
Chinese.jump_queue("暂时随便传个参数")

技术图片

class Chinese:
    ‘这是一个中国人的类‘
    dang = ‘gong chan党‘
    def helpp():
        print("一个人正在帮助老奶奶")
    def jump_queue(self):
        print("插到了前面")

print(dir(Chinese)) #以列表形式存放属性名
print(Chinese.__dict__) #查看字典属性
#类的点方法就是到属性字典里面取值
print(Chinese.__dict__["dang"])
Chinese.__dict__["helpp"]()
Chinese.__dict__["jump_queue"]("暂时随便传个参数")

技术图片

 四、特殊的类属性

class Chinese:
    ‘这是一个中国人的类‘
    dang = ‘gong chan 党‘
    def helpp():
        print("一个人正在帮助老奶奶")
    def jump_queue(self):
        print("插到了前面")

print(Chinese.__name__) #类名字符串
print(Chinese.__doc__)# 类文档字符串
print(Chinese.__base__) #类的老祖先(讲继承时讲)
print(Chinese.__bases__)#类的祖先元组形式
print(Chinese.__module__) #类所在的模块
print(Chinese.__class__) #实例该类对应的类

技术图片  

五、对象相关知识

class Chinese:
    ‘这是一个中国人的类‘
    dang = ‘gong chan 党‘
    def __init__(self, name, age, gender):  #初始化,实例化类的时候自动调用
        self.mingzi = name
        self.nianling = age
        self.xingbiie = gender

    def helpp():
        print("一个人正在帮助老奶奶")
    def jump_queue(self):
        print("插到了前面")

#实例化,就是调用__init__的过程,实例化的结果不包括函数属性,只有数据属性。
p1 = Chinese(‘金灵‘, 19, ‘girl‘)
print(p1.__dict__) #得到init中初始化的字典数据
print(p1.__dict__["nianling"])
print(p1.nianling)  #下面这个是通过点方法直接查看年龄,其内部就是上面那个过程

技术图片

class Chinese:
    ‘这是一个中国人的类‘
    dang = ‘gong chan 党‘
    def __init__(self, name, age, gender):  #初始化,实例化类的时候自动调用
        self.mingzi = name
        self.nianling = age
        self.xingbiie = gender

    def helpp():
        print("一个人正在帮助老奶奶")
    def jump_queue(self):
        print("插到了前面".format(self.mingzi))

#实例化,就是调用__init__的过程,实例化的结果不包括函数属性,只有数据属性。
p1 = Chinese(‘乔碧萝‘, 58, ‘wuman‘)
Chinese.jump_queue(p1)  #太low,用下面的对象方法调用
p1.jump_queue()
p1.helpp()  #会报错,因为在python底层,会把这行代码写成 p1.helpp(p1),而函数本身不需要参数

 技术图片 

 

self的意义:

self 就是实例本身,这里指 p1

class Chinese:
    ‘这是一个中国人的类‘
    dang = ‘gong chan 党‘
    def __init__(self, name, age, gender):  #初始化,实例化类的时候自动调用
        self.mingzi = name
        self.nianling = age
        self.xingbiie = gender

    def helpp():
        print("一个人正在帮助老奶奶")
    def jump_queue(self):
        print("插到了前面".format(self.mingzi))

#实例化,就是调用__init__的过程,实例化的结果不包括函数属性,只有数据属性。
p1 = Chinese(‘乔碧萝‘, 58, ‘wuman‘)
#调用jump_queue函数时,先在p1所在的init下(即p1.__dict__)下去找,找不到去外面一层找,即类字典下(Chinese.__dict__)
#即函数属性跟类要
p1.jump_queue()

技术图片  

 

以上是关于python课堂整理33----面向对象(我的对象又在哪里)的主要内容,如果未能解决你的问题,请参考以下文章

python课堂整理14---函数式编程

10.4 Python 面向对象应用实例(设计扑克牌发牌程序)

python课堂整理5---元组

python 课堂15 面向对象3 内部方法,类的定制

Python自动化开发课堂笔记Day08 - Python进阶(面向对象的高级用法,网络编程)

Python20期课堂总结-20180120day7-面向对象之继承组合多态封装等