首页 > 其他 > 详细

面向对象初阶

时间:2020-06-14 22:26:59      阅读:54      评论:0      收藏:0      [点我收藏+]

1.oop类实现

技术分享图片
‘‘‘
    驼峰命名法:
        大驼峰:每个单词首字母大写
        小驼峰:第二个单词首字母大写
‘‘‘

# 定义一个汽车类
class Cart():
    # 属性
    color = 白色
    brand = 奥迪
    pailiang = 2.4
    # 方法
    def lahuo(self):
        print("小汽车能拉货")

    def doufeng(self):
        print("小汽车能兜风")

    def bamei(self):
        print(带妹子去嗨...)

aodi = Cart()
aodi.bamei()
View Code

 

2.oop对象成员的操作

技术分享图片
‘‘‘
    什么是对象成员?
        一个对象通过类实例化之后,那么在类中定义的属性和方法,可以使用实例化的对象来操作
        类中定义的属性也称为成员属性,类中定义的方法,也称为成员方法

‘‘‘

# 定义一个汽车类
class Cart():
    # 属性
    color = 白色
    brand = 奥迪
    pailiang = 2.4
    # 方法
    def lahuo(self):
        print("小汽车能拉货")

    def doufeng(self):
        print("小汽车能兜风")

    def bamei(self):
        print(带妹子去嗨...)

# 实例化对象
a = Cart()
b = Cart()

# 对象的成员操作
# 一,在类的外部,使用对象操作属性
# 访问成员属性,先找对象有没该属性,没有再去类中找
res = a.color
print(res)
# 修改属性值
# 注意:修改对象的属性值:实际上等于给对象创建了一个属于自己的color属性
a.color = 黑色
print(a.color)
# 添加属性
a.name = A6 # 该属性只属于该对象
print(a.name)
# 删除属性(只在类中存在的不能删除,对象自己的属性可以删除)
del a.name
del a.color
# del a.color


# 二,在类的外部,操作对象的方法
# 访问对象的方法:实际上如果这个对象没有自己的方法,那么会访问这个对象所属类的方法
a.lahuo()

# 修改对象的方法
def func():
    print(这是一个新的方法)
a.lahuo = func
a.lahuo()

# 添加新的方法
a.func2 = func
a.func2()

# 删除方法
del a.func2
del a.lahuo
# del a.bamei 不可以删除对象类的方法,只能删除自己的方法


‘‘‘
总结:
一个类定义类成员属性和成员方法,那么通过这个类实例化的对象,也具备这些方法和属性吗?
    实际上,创建对象的时候,并不会把类中的属性和方法复制一份给对象,而是在对象中引用父类的方法
    因此在访问对象的的属性和方法时,先找自己的,在找父类的。
    
一个对象由类创建后,是一个独立的对象,会引用父类中的属性和方法
如果在对象创建后,给对象的属性或方法,进行修改或添加,那么此时等于给这个对象创建了一个自己的属性和方法
所以在删除时,只能删除对象中添加或修改的属性和方法
‘‘‘
View Code

 

3.oop中的self详解

技术分享图片
‘‘‘
    self只是一个形参,并不是关键字
    self在方法中代表对象自己
    self在方法中代表对象可以去操作成员,可以使用self在类的内部访问成员
    对象能做的事情,self在类的内部都能做
    不含self的方法只能用类来调用
‘‘‘

class Person():
    name = 名字
    age = 年龄
    sex = 性别

    def sing(self):
        print(会唱....)
    def dance(self):
        print(会跳....)
    def rap(self):
        print(会rap....)

    def func(self,a,b,c):
        # 测试,在类的内部是否可以像外部一样,去访问和操作成员
        self.name = a
        self.age = b
        self.sex = c
        print(self)
zs = Person()
print(zs.name)
zs.func(yyj,24,)
print(zs.name,zs.age,zs.sex)
View Code

 

4.oop类成员的操作(了解)

技术分享图片
# 定义一个汽车类
class Cart():
    # 属性
    color = 白色
    brand = 奥迪
    pailiang = 2.4
    # 方法
    def lahuo(self):
        print("小汽车能拉货")

    def doufeng(self):
        print("小汽车能兜风")

    def bamei(self):
        print(带妹子去嗨...)

# 在类的外部,可以直接通过类对成员进行操作
a = Cart()
print(Cart.color)

# 修改属性
# 修改以后,实例化的对象也会修改
Cart.color = 黑色
print(Cart.color)

b = Cart()
print(a.color)
print(b.color)
View Code

 

5.oop初始化方法init

技术分享图片
‘‘‘
魔术方法:
    魔术方法也和普通方法一样都是类中定义的成员方法
    魔术方法不需要手动去调用,会再某种情况下,自动触发(自动执行)
    多数魔术方法 前后都有两个连续的下划线
    魔术方法不是我们自己定义的,而是系统定义好的,我们来使用

__init__ 初始化方法
    触发机制:通过类实例化对象自动触发的一个方法
    作用:   可以在对象实例化后完成对象的初始化(属性赋值,方法的调用)
    应用场景:文件的打开,资源的获取,干活前的准备工作
    注意事项:
‘‘‘

class Person():
    name = None
    age = None
    sex = None

    def __init__(self,n,a,s):
        self.name = n
        self.age = a
        self.sex = s
        self.say()

    def say(self):
        print("大家好,我是渣渣辉,是兄弟就来砍我")

zzh = Person(渣渣辉,60,)
View Code

 

6.oop析构方法del

技术分享图片
‘‘‘
__del__ 析构方法
    触发机制:当前类实例化的对象被销毁时,自动触发
    作用:   可以在析构方法中完成一些特殊任务,比如在初始化方法中打开的文件可以关闭
    应用场景:
    注意事项:是对象被销毁时触发了这个方法,而不是这个方法销毁了对象

对象会在哪些情况下被销毁?
    1.当程序执行完毕,内存中的所有资源都会被销毁释放
    2.使用del删除对象时
    3.对象不再被引用时,会自动销毁(对象指向None或者实例化时没有被接受)
‘‘‘

‘‘‘
定义一个类,完成一个信息的记录
    调用这个对象的时候,传递一个信息
    这个对象会创建一个文件,开始写入,并在最后关闭这个文件
‘‘‘
import time

class writeLog():
    # 文件路径
    fileurl = ./
    # 日志名称
    filename = 2019-10-10.log

    # 初始化 打开文件
    def __init__(self):
        # 完成文件的打开
        self.fileobj = open(self.fileurl+self.filename,a+,encoding=utf-8)

    # 写日志的方法
    def log(self,s):
        print(f把日志:{s} 写入文件中)
        self.fileobj.write(f把日志:{s} 写入文件中)

    # 析构方法
    def __del__(self):
        print(析构方法被触发了)
        # 在对象被销毁时,关闭在初始化方法中打开的文件对象
        self.fileobj.close()

l = writeLog()
l.log(今天天气还不错哦...)

print(......)
View Code

 

7.oop日志类的封装

技术分享图片
‘‘‘
日志类
    class Mylog
    功能:
        能够随时写入一个日志信息

分析:
    日志文件在什么地方? 默认当前目录
    日志文件的名是什么?  当前日期:2020-04-13.log
    日志的格式是什么样的? 2020-04-13 12:12:12  错误信息...

    属性:成员属性的作用就是存储信息,供成员方法使用
        日志文件的地址:fileurl
        日志文件的名称:filename
        打开的文件对象:fileobj

    方法:具体完成一个功能的过程
        __init__() ==> 初始化方法,完成对象的初始化,并打开文件
        wlog()     ==> 负责接收给日志的信息,并写入到日志文件中
        __del__()  ==> 析构方法,在对象被销毁时,关闭打开的文件
‘‘‘


import time
class Mylog():
    # 文件路径
    fileurl = ./
    # 日志名称
    filename = str(time.strftime(%Y-%m-%d)) + .log
    fileobj = None

    # 初始化 打开文件
    def __init__(self):
        # 完成文件的打开
        self.fileobj = open(self.fileurl + self.filename, a+, encoding=utf-8)

    # 写日志的方法
    def wlog(self, s):
        # 2020-04-13 12:12:12  错误信息...
        data = time.strftime(%Y-%m-%d %H:%M:%S)
        msg = data +   + s
        # print(msg)
        self.fileobj.write(msg+\n)
    # 析构方法
    def __del__(self):
        # print(‘析构方法被触发了‘)
        # 在对象被销毁时,关闭在初始化方法中打开的文件对象
        self.fileobj.close()

w = Mylog()
# w.wlog(‘今天天气不错哦....‘)
w.wlog(一个人在家学习...)
View Code

 

8.oop封装

技术分享图片
‘‘‘
被特殊语法封装的成员,会有不同的访问权限

封装级别
    公有的 public
        不需要做任何处理
    受保护的 protected
        在成员前面加_ (约定俗成,而Python没有具体实现)
    私有的 private
        在成员前面加__

差别:      公有的 public  受保护的 protected      私有的 private
在类的内部        OK              OK                   OK
在类的外部        OK              NO(Python可以)        NO


可以使用特殊的语法获取到私有变量
‘‘‘


class Person():
    name = None
    _age = None
    __sanwei = None
    sex = None

    def __init__(self,n,a,s):
        self.name = n
        self._age = a
        self.__sanwei = s

    def say(self):
        print(self.__sanwei)
        print(聊聊人生和理想...)

    def _sing(self):
        print(高歌一曲...)

    def __kiss(self):
        print(打个kiss...)

ym = Person(杨幂,25,60 50 60)
print(ym.say())

# 可以使用特殊的语法获取到私有变量
# print(ym._Person__sanwei)

# 查看对象的所有成员
print(ym.__dict__)  # 获取当前对象自己的所有成员信息(不包括类中存在的成员信息)
print(Person.__dict__) # 获取当前类的所有成员信息
View Code

 

9.oop继承

技术分享图片
‘‘‘
1.当子类继承父类后,就可以去使用父类中的成员属性和方法(除了私有成员)
2.子类可以有自己独立的属性和方法,也可以没有
3.子类继承父类后,重新定义了父类中的方法,这种情况称为对父类方法的重写
4.在子类中可以去直接调用父类中定义的属性和方法使用super()
5.子类继承父类后,定义了父类中没有的方法,这种情况称为对父类的扩展
6.一个父类可以被多个子类继承
7.子类调用父类的方法时,如果该方法有参数要求,也需要传递参数
‘‘‘

# 猫科动物
class maoke():
    # 属性
    maose = 猫纹
    sex = m

    # 方法
    def pao(self):
        print(走猫步)
    def pa(self):
        print(能上树)

# 定义猫类
class mao(maoke):
    # 继承父类后,重新定义了父类中的方法
    def pa(self):
        print(super().maose)
        super().pa()
        print(很快的就能上树...)

# 通过猫类实例化对象
h = mao()
# print(h)

# 可以获取对象的属性  寻找过程:猫对象自己的属性==>猫类属性==>猫的父类属性
# print(h.maose)
# 可以获取对象的方法  寻找过程:猫对象自己的方法==>猫类方法==>猫的父类方法
h.pa()
View Code

 

10.oop多继承

技术分享图片
‘‘‘
多继承语法

class 父亲():
    pass

class 母亲():
    pass

class 子类(父亲,母亲):
    pass


在多继承中调用方法时,先找自己有没有,再找第一个继承类,再找第二个继承类,依次下去。
‘‘‘


class F():


    def eat(self):
        print(大口喝酒,大口吃肉...)


class M():
    def eat(self):
        print(动作优雅,浅尝辄止)


class C(F,M):
    def eat(self):
        super().eat()
        print(吃也哭,不吃也哭)



c = C()
c.eat()
View Code

 

11.oop菱形继承

技术分享图片
‘‘‘
    A
  B   C
    D
‘‘‘

class H():
    num = 555

    def eat(self):
        print(顿顿挨饿...)



class HuMan():
    num = 444
    def eat(self):
        print(self.num)
        print(顿顿都是小烧烤...)
        self.say()
    def say(self):
        print("我是HuMan中的say")


class F(HuMan):
    num = 333
    def eat(self):
        super().eat()
        print(super().num)
        print(大口喝酒,大口吃肉...)


class M(HuMan):
    num = 222
    def eat(self):
        super().eat()
        print(super().num)
        print(动作优雅,浅尝辄止)


class C(F,M):
    num = 111
    def eat(self):
        super().eat()
        print(super().num)
        print(吃也哭,不吃也哭)
    def say(self):
        print("我是C中的say")

c = C()
c.eat()
print(c.num)

‘‘‘
继承关系:C->F->M->HuMan
在调用父类方法时self始终表示对象自己
‘‘‘

# mro() 获取MRO列表,就是类的继承关系
print(C.mro())
‘‘‘
[<class ‘__main__.C‘>, 
<class ‘__main__.F‘>, 
<class ‘__main__.M‘>,
<class ‘__main__.HuMan‘>, 
<class ‘object‘>]
‘‘‘

‘‘‘
super()
    使用super去调用父级方法时,实际上是在用super调用MRO列表中的上一级中的方法
    使用super去访问父级属性时,实际上是在用super访问MRO列表中的上一级中的属性
super()本身调用父级方法时,传递的self对象,就是这个方法中self对象自己
‘‘‘

res = C.__bases__
print(res)
View Code

 

12.oop菱形继承2

技术分享图片
‘‘‘
    A
  B   C
    D
‘‘‘

class H():
    def eat(self):
        print(顿顿挨饿...)



class HuMan():
    def eat(self):
        print(顿顿都是小烧烤...)

class F(HuMan):
    # def eat(self):
    #     print(‘大口喝酒,大口吃肉...‘)
    pass


class M(HuMan):
    def eat(self):
        print(动作优雅,浅尝辄止)

class C(F,M):
    pass

c = C()
c.eat()
View Code

 

13.oop继承关系检测

技术分享图片
class A:
    pass

class B(A):
    pass

class C(A):
    pass

class D(B,C):
    pass

# 获取mro列表

print(D.mro())

# 检测一个类是不是另一个类的子类
res = issubclass(D,B)
print(res)
res = issubclass(D,C)
print(res)
res = issubclass(D,A)
print(res)

res = issubclass(B,C)
print(res)
res = issubclass(C,B)
print(res)
View Code

 

14.oop多态

技术分享图片
# 对于同一个方法,由于调用的对象不同(或传入的对象不同,最终实现了不同的结果)


# 定义电脑类
class Computer():
    # 在电脑类中定义了一个sub的规范的接口方法
    def usb(self,obj):
        obj.start()

class Mouse():
    def start(self):
        print(鼠标启动成功,可以双击单击嗨起来...)

class KeyBord():
    def start(self):
        print(键盘启动成功...)

class Udisk():
    def start(self):
        print(U盘启动了....)


# 实例化对象
c = Computer()
m = Mouse()
k = KeyBord()
u = Udisk()

c.usb(m)
c.usb(k)
c.usb(u)
View Code

 

15.oop多态继承版

技术分享图片
‘‘‘
定义一个接口规范类,其他类都继承这个类,并实现(重写)父类中的方法
由于每个对象实现父类方法的方式或者过程都不相同,最后的结果是不一样的形态
‘‘‘

# 定义 USB
class USB():
    ‘‘‘
    当前类说明:
    这个类是一个接口规范类,需要子类继承并实现start方法
    start方法不做任何具体的功能实现
    ‘‘‘
    # 在USB类中定义一个规范的接口方法,但是不实现任何功能
    def start(self):
        pass

# 定义鼠标类
class Mouse(USB):
    def start(self):
        print(鼠标启动成功,可以双击单击嗨起来...)

# 定义键盘类
class KeyBord(USB):
    def start(self):
        print(键盘启动成功...)

# 定义U盘类
class Udisk(USB):
    def start(self):
        print(U盘启动了....)

# 实例化对象
m = Mouse()
k = KeyBord()
u = Udisk()

m.start()
k.start()
u.start()
View Code

 

面向对象初阶

原文:https://www.cnblogs.com/yuyunjie/p/13127342.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!