Python学习15-面向对象

查看所有Python相关学习笔记

面向对象

  • 面向对象知识点汇总:
1. 获取属性:  
    > 1-实例对象.属性  ---    . 是调用的意思  
    > 2-类属性(静态属性)---这个属性是属于所有类的对象    
         1-对象.属性         
         2-类.属性
2. 初始化方法===构造方法--```def ____init__(self):```
    > 作用:只要创建实例,就会被调用
3. self--本身--->指实例的本身--->t1   --t1 = Tiger(200)
    > 可以改其他字符 ---但不建议改--->规范
4. 实例方法:
    > 定义:def tell(self):----self 是具体的调用实例  
    > 作用:每个实例个体都有自己的输出
5. 静态方法==类方法
    @staticmethod 修饰,没有self
6. from  random import randint #取随机---
    > 要点:游戏-每一次的弹出的房间号是随机的
        2-randint(0,2)可以取: 0,1,2  闭区间
7. 计算游戏时间:time.time()---秒
8. 继承:
    class SouthTiger(Tiger,WonTiger):#括号内是 多个或一个父类名
9. 子类对象调用父类被重写的方法:
    super(SouthTiger,h1).roar()
  • 面向对象
    • 静态属性
    • 实例属性(self)
    • 静态方法(@staticmethod)(可以访问静态属性:类名.属性)(不可以访问实例属性)
    • 实例方法(self)(可以访问实例属性:self.属性)
    • 类方法(cls)(@classmethod)(不可以访问实例属性)(使用较少,基本不用)
    class Tiger:
        '老虎'
        classname = 'tiger'#静态属性
        def __init__(self,weight = 200):#实例属性
            self.weight = weight
        def tellWeight(self):#实例方法
            print( f'my weight is {self.weight}')
        def roar(self):
            print('wow!!!')
            self.weight -= 5
        @staticmethod # 静态方法
        def roar2():
            print(Tiger.classname)
    
  • 对象的继承
    class SubClassName (ParentClass1[,ParentClass2]):
        pass
    
    class NeTiger(Tiger):
        '继承虎'
        color = 'red'
        classname= 'dongbei tiger'
        def __init__(self,weight=200):
            Tiger.__init__(self,weight) #调用父类的初始化方法
        @staticmethod
        def jump():
            print('两米高')
    

类和对象

对象对象 = 属性 + 方法

Python中的类名约定以大写字母开头
Python中的函数名约定以小写字母开头

面向对象简介OO=Object Oriented

  • 封装 信息隐蔽技术
  • 继承 继承是子类自动共享父类之间数据和方法的机制
# Mylist继承了list的方法和属性
class Mylist(list):
    pass
list2 = Mylist()
list2.append(5)
print(list2)
# 执行结果
[5]
  • 多态 名字一样,实现不一样
    “多态”部分内容概念理解错误,后期调整,请暂时略过
class A:
    def fun(self):
        print('我是A')
class B:
    def fun(self):
        print('我是B')
a = A()
b = B()
a.fun()
b.fun()
# 执行结果
我的A
我的B

面向对象编程

OOA:面向对象分析
OOD:面向对象设计
OOP:面向对象编程

  • self是什么?

Python的self相当于C++的this指针
同一个类可以生成无数个对象,self相当于门牌号

class Ball:
    def setName(self,name):
        self.name = name
    def kick(self):
        print('我叫%s,该死的,谁踢我...' % self.name)
a = Ball()
a.setName('球A')
b = Ball()
b.setName('球B')
c = Ball()
c.setName('土豆')
a.kick()
c.kick()
# 执行结果
我叫球A,该死的,谁踢我...
我叫土豆,该死的,谁踢我...
  • 构造方法__init__(self,param1,param2...) Python的魔法方法
class Ball:
    def __init__(self,name='qiu'):
        self.name = name
    def kick(self):
        print('我叫%s,该死的,谁踢我...' % self.name)
a = Ball('球A')
b = Ball()
c = Ball('土豆')
a.kick()
b.kick()
c.kick()
# 执行结果
我叫球A,该死的,谁踢我...
我叫qiu,该死的,谁踢我...
我叫土豆,该死的,谁踢我...
  • 公有和私有伪私有

在Python中定义私有变量只需要在变量名或函数名前加上“”两个下划线,那么这个函数或变量就变为私有的了
私有后必须使用内部方法调用或通过'
类名
_变量名'来访问

class Person:
    __name = '测试'
    def getName(self):
        return self.__name
p = Person()
a = p.getName()
print(a)
# 执行结果
测试
测试

继承

单继承
class DerivedClassName(BaseClassName):
    pass

BaseClassName 被继承的类:基类、父类、超类

  • 子类可以调用父类方法
class Parent:
    def hello(self):
        print('正在调用父类的方法')
class Child(Parent):
    pass
p = Parent()
p.hello()
c = Child()
c.hello()
# 执行结果
正在调用父类的方法
正在调用父类的方法
  • 子类重写了父类的方法,将会覆盖掉父类的方法
# 例一:
class Parent:
    def hello(self):
        print('正在调用父类的方法')
class Child(Parent):
    def hello(self):
        print('正在调用子类的方法')
p = Parent()
p.hello()
c = Child()
c.hello()
# 执行结果
正在调用父类的方法
正在调用子类的方法
# 例二
import random as r

class Fish:
    def __init__(self):
        self.x = r.randint(1,10)
        self.y = r.randint(1,10)
    def move(self):
        self.x -= 1
        print('我的位置是:',self.x,self.y)
class Goldfish(Fish):
    pass
class Carp(Fish):
    pass
class Shark(Fish):
    def __init__(self):
        self.hungry = True
    def eat(self):
        if self.hungry:
            print('吃货的梦想就是天天有的吃!!!')
        else:
            print('太撑了,吃不下了!')
print('调用父类.......................')
fish = Fish()
fish.move()
fish.move()
print('子类未重写,可调用父类的move.....')
goldfish = Goldfish()
goldfish.move()
goldfish.move()
print('子类已重写,不可调用父类的move...')
shark = Shark()
shark.eat()
shark.eat()
# shark.move() # AttributeError: 'Shark' object has no attribute 'x'
# 执行结果
调用父类.......................
我的位置是: 7 2
我的位置是: 6 2
子类未重写,可调用父类的move.....
我的位置是: 2 9
我的位置是: 1 9
子类已重写,不可调用父类的move...
吃货的梦想就是天天有的吃!!!
太撑了,吃不下了!

  • 重写父类方法是想继续保持父类方法不被覆盖,可以采用以下两种方法
    • 调用未绑定的父类方法(需要使用父类的名字)
    import random as r
    class Fish:
        def __init__(self):
            self.x = r.randint(1,10)
            self.y = r.randint(1,10)
        def move(self):
            self.x -= 1
            print('我的位置是:',self.x,self.y)
    class Goldfish(Fish):
        pass
    class Carp(Fish):
        pass
    class Shark(Fish):
        def __init__(self):
            self.hungry = True
            Fish.__init__(self)  # 调用未绑定的父类方法
        def eat(self):
            if self.hungry:
                self.hungry = False
                print('吃货的梦想就是天天有的吃!!!')
            else:
                print('太撑了,吃不下了!')
    shark = Shark()
    shark.move() 
    # 执行结果
    我的位置是: 9 6 # move方法调用成功
    
    • 使用super函数(不用给出任何父类的方法)
    import random as r
    
    class Fish:
        def __init__(self):
            self.x = r.randint(1,10)
            self.y = r.randint(1,10)
        def move(self):
            self.x -= 1
            print('我的位置是:',self.x,self.y)
    class Goldfish(Fish):
        pass
    class Carp(Fish):
        pass
    class Shark(Fish):
        def __init__(self):
            self.hungry = True
            super().__init__()  # 使用super
        def eat(self):
            if self.hungry:
                self.hungry = False
                print('吃货的梦想就是天天有的吃!!!')
            else:
                print('太撑了,吃不下了!')
    shark = Shark()
    shark.move() 
    # 执行结果
    我的位置是: 7 5
    
多继承,既可以调用父类1的方法也可以调用父类2的方法
class Base1:
    def foo1(self):
        print('我的foo1,我未Base1代言')
class Base2:
    def foo2(self):
        print('我的foo2,我未Base2代言')
class C(Base1,Base2):
    pass
c = C()
c.foo1()
c.foo2()
# 执行结果
我的foo1,我未Base1代言
我的foo2,我未Base2代言

组合

把类和实例化放到一个新的类里
把没有继承关系的类放到一起
补充:Mix-in

class Trutle:
    def __init__(self,x):
        self.num = x
class Fish:
    def __init__(self,x):
        self.num = x
class Pool:
    def __init__(self,x,y):
        self.trutle = Trutle(x)
        self.fish = Fish(y)
    def print_num(self):
        print('水池总共有乌龟%d只,小鱼%d只' %(self.trutle.num,self.fish.num))
pool = Pool(4,5)
pool.print_num()
# 执行结果
水池总共有乌龟4只,小鱼5只

类、类对象、实例对象

  • 属性的名字跟方法名相同,属性会覆盖方法
  • 不要试图在一个类里面定义出所有能想到的特性和方法,应该利用继承和组合机制来进行扩展
  • 用不同的词性命名,如属性名用名词,方法名用动词

什么是绑定self

Python严格要求方法需要有实例才能被调用,这种限制其实就是Python所谓的绑定概念。

实例化后,即使删除类,原来实例化的对象任然有效

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容