面向对象

面向对象三大特点

  • 封装:既可对数据结构进行封装,又可对处理数据的方法进行封装
  • 继承:强调的父子类的关系
  • 多态:不同对象调用相同的方法,会有不同的响应

类的继承

  • 相关概念

    • 继承:父类的属性和方法,子类直接拥有,称为继承
    • 派生:子类在父类的基础上衍生出新的特征(属性和行为)
    • 总结:其实他们是一回事,只是描述问题的侧重点不同(继承强调相同点,派生强调不同点)
  • 继承语法

    # class Animal(object):
    # 当没有指定父类时,默认继承object
    class Animal:
    def __init__(self, name):
    self.name = name def eat(self):
    print('小动物喜欢一天到晚出个不停') # 继承自Animal
    class Dog(Animal):
    pass d = Dog('旺财')
    # 可以拥有父类的方法
    d.eat()
    # 也可以拥有父类的属性
    print(d.name)
  • 派生示例

    class Animal:
    def run(self):
    print('小动物喜欢成天跑个不停') class Cat(Animal):
    def eat(self):
    print('猫喜欢吃老鼠') tom = Cat() tom.run()
    # 多出来的行为
    tom.eat() # 多出来的属性
    tom.color = '蓝色'
    print(tom.color)
  • 重写方法

    • 若父类的方法完全不合适,可以进行覆盖重写
    • 若父类的方法不够完善,可以添枝加叶进行完善
    • 示例:
    class Animal:
    def eat(self):
    print('小动物一天到晚的出个不停') def run(self):
    print('小动物一天到晚的四处连跑') class Cat(Animal):
    # 父类的方法完全不合适,覆盖重写
    def run(self):
    print('俺走的是猫步') # 父类的方法部分合适,需要添加内容进行完善
    def eat(self):
    # 保留父类的内容,不建议使用此方式
    # Animal.eat(self)
    # super(Cat, self).eat()
    # 类名及self可以不传
    super().eat()
    print('不过俺喜欢吃鱼') jiafei = Cat()
    jiafei.run()
    jiafei.eat()
  • 多继承:一个子类可以拥有多个父类

    class A:
    def eat(self):
    print('eat func in class A') class B:
    def eat(self):
    print('eat func in class B') class C(A, B):
    def eat(self):
    # 这种方案是默认的继承顺序进行选择的父类方法
    # super().eat()
    # 人为指定调用某个父类的方法
    B.eat(self) c = C()
    c.eat()

访问权限

  • 权限

    • 公有的:类中的普通的属性和方法,默认都是公有的;可以在类内、类外、子类中使用
    • 私有的:定义时在前面添加两个'_',就变成了私有的;只能在类内使用,不能在类外及子类中使用
  • 示例:

    class Person:
    def __init__(self, name):
    self.name = name
    self.__age = 20 def eat(self):
    print('民以食为天') def __test(self):
    print('__test') xiaoming = Person('小明')
    print(xiaoming.name)
    xiaoming.eat()
    # 不能在类外使用
    print(xiaoming.__age)
    xiaoming._Person__test()
    print(xiaoming.dict)
    # 尽管可以这样访问私有属性,但是强烈建议不要这样使用
    print(xiaoming._Person__age) class Man(Person):
    def introduce(self):
    # 不能在子类中使用
    # print(self.__age)
    print('我叫{}'.format(self.name))
    self.eat() m = Man('诸葛')
    m.introduce()

类属性

  • 说明:定义类时,写在方法外的属性,通常会写在类的开头,这样的属性称为类属性

  • 示例:

    class Person:
    # 类属性,通过类名访问,属于整个类,而不是某个对象
    # nation = '中国' # 限制可以使用的属性,提高访问的效率
    # 也可以提高访问速度,减少内存使用
    __slots__ = ('name', 'age', 'nation') def __init__(self, name):
    self.name = name
    self.nation = 'china' p1 = Person('小明')
    p2 = Person('小红')
    print(p1.name, p2.name)
    print(Person.nation)
    # p1.nation = 'china'
    print(p1.nation)
    print(p2.nation)
    # print(Person.nation) p1.age = 20
    # p1.height = 180 # 特殊的类属性
    # 表示类名的字符串
    print(Person.__name__) # 表示父类构成的元组
    print(Person.__bases__) # 存储类的相关信息
    print(Person.__dict__) # 限制可以使用的属性
    print(Person.__slots__)

类方法

  • 说明:

    • 定义时使用classmethod装饰器装饰的方法
    • 使用时通过类名调用
  • 作用:

    • 可以创建对象或者简洁的创建对象
    • 对外提供简单易用的接口
  • 示例1:创建对象

    class Person:
    def eat(self):
    print('我喜欢吃麻辣烫,不要麻椒和辣椒') @classmethod
    def test(cls):
    print(cls)
    print('类方法') # 创建对象,或者简洁的创建对象
    @classmethod
    def create(cls):
    p = cls()
    p.age = 1
    return p p1 = Person()
    p1.eat() # 通过类名调用
    Person.test()
    # 创建或简洁的创建对象
    p2 = Person.create()
    print(type(p2))
  • 示例2:提供接口

    class Number:
    def __init__(self, num1, num2):
    self.num1 = num1
    self.num2 = num2 def add(self):
    return self.num1 + self.num2 def sub(self):
    return self.num1 - self.num2 def mul(self):
    return self.num1 * self.num2 def div(self):
    if self.num2 == 0:
    return None
    return self.num1 / self.num2 # 对外提供简单易用的接口
    @classmethod
    def pingfanghe(cls, num1, num2):
    n1 = cls(num1, num1)
    n12 = n1.mul() n2 = cls(num2, num2)
    n22 = n2.mul() n3 = cls(n12, n22)
    return n3.add() he = Number.pingfanghe(3, 4)
    print(he)

静态方法

  • 说明:

    • 使用staticmethod装饰器装饰的方法(方法没有cls参数)
    • 通过类名进行调用
  • 示例:

    class Person:
    @staticmethod
    def test():
    print('static method test') # 创建对象
    @staticmethod
    def create():
    p = Person()
    return p Person.test()
    p = Person.create()
    print(p)
  • 总结:

    • 凡是静态方法完成的功能都可以是类方法完成
    • 若方法中没有使用到类名(cls),可以使用静态方法

多态特性

  • 定义:不同的对象,调用相同的方法,有不同的响应,称为多态

  • 示例:

    class Animal:
    def run(self):
    pass class Dog(Animal):
    def run(self):
    print('狗通常走S型') class Cat(Animal):
    def run(self):
    print('猫平时走猫步,偶尔突然加速') def test(obj):
    obj.run() d = Dog()
    c = Cat()
    test(d)
    test(c)

属性函数

  • 说明:将成员方法当做属性一样进行访问

  • 作用:保护特定属性,或者对特定属性进行处理

  • 示例:

    class User:
    def __init__(self, username, password):
    self.username = username
    self.__password = password # 该方法可以像成员属性一样访问
    @property
    def password(self):
    print('有人想查看密码')
    return '想偷看密码,没门'
    # return self.__password # 在设置密码时,会自动调用
    @password.setter
    def password(self, password):
    print('@password.setter', password)
    self.__password = '加密' + password + '加密' u = User('xiaoming', '')
    # print(u.password())
    print(u.password) # 设置密码,会自动调用setter方法
    u.password = 'abcde'

Python基础—12-面向对象(02)的更多相关文章

  1. python基础之面向对象02

    ---继承 当我们定义完成某个类时,可以再定义一个新类,新类可以继承第一个类.新类被称为子类,而被继承的类称为父类/基类/超类. 继承就是子类继承父类的属性和方法(注意是类属性和类方法). 继承可以使 ...

  2. Python 基础 四 面向对象杂谈

    Python 基础  四  面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...

  3. python基础,函数,面向对象,模块练习

    ---恢复内容开始--- python基础,函数,面向对象,模块练习 1,简述python中基本数据类型中表示False的数据有哪些? #  [] {} () None 0 2,位和字节的关系? # ...

  4. (转)Python成长之路【第九篇】:Python基础之面向对象

    一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...

  5. [.net 面向对象编程基础] (12) 面向对象三大特性——继承

    [.net 面向对象编程基础] (12) 面向对象三大特性——继承 上节我们说了面向对象的三大特性之一的封装,解决了将对同一对象所能操作的所有信息放在一起,实现统一对外调用,实现了同一对象的复用,降低 ...

  6. 自学Python之路-Python基础+模块+面向对象+函数

    自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python    1.1 自学Python1.1-简介    1.2 自学Python1.2-环境的 ...

  7. 二十. Python基础(20)--面向对象的基础

    二十. Python基础(20)--面向对象的基础 1 ● 类/对象/实例化 类:具有相同属性.和方法的一类人/事/物 对象(实例): 具体的某一个人/事/物 实例化: 用类创建对象的过程→类名(参数 ...

  8. 十二. Python基础(12)--生成器

    十二. Python基础(12)--生成器 1 ● 可迭代对象(iterable) An object capable of returning its members one at a time. ...

  9. 『Python基础-12』各种推导式(列表推导式、字典推导式、集合推导式)

    # 『Python基础-12』各种推导式(列表推导式.字典推导式.集合推导式) 推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的 ...

  10. Day7 - Python基础7 面向对象编程进阶

    Python之路,Day7 - 面向对象编程进阶   本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...

随机推荐

  1. 深入理解JavaScript系列(6):S.O.L.I.D五大原则之单一职责SRP

    前言 Bob大叔提出并发扬了S.O.L.I.D五大原则,用来更好地进行面向对象编程,五大原则分别是: The Single Responsibility Principle(单一职责SRP) The ...

  2. 在浏览器中对访问的网页中的cookie添加和修改

    做权限相关的东西,使用到了cookie,关于它的安全性,cookie在浏览器中,通过插件是可以对其进行修改的,如下: 1.FireFox 安装Edit This Cookie 插件,之后点击插件图标即 ...

  3. [转]JS跨域解决方式 window.name

    本文转自:http://www.cnblogs.com/lichuntian/p/4909465.html window.name 传输技术,原本是 Thomas Frank 用于解决 cookie ...

  4. setInterval()的三种写法

    前言: setInterval("fun()",time)有两个参数:fun()为要执行的函数:time为多久执行一次函数,单位是毫秒: 我们做一个简单的例子,就是每隔5s弹出一个 ...

  5. Java NIO(四) Scatter/Gather

    Java NIO开始支持scatter/gather,scatter/gather用于描述从Channel(译者注:Channel在中文经常翻译为通道)中读取或者写入到Channel的操作.分散(sc ...

  6. Linux c获取时间

    linux c获得时间和设置时间 #include<time.h> //C语言的头文件 #include<stdio.h> //C语言的I/O void main() { ti ...

  7. 一个.java源文件中可以有多个类吗?(内部类除外)有什么条件?

    一个.java源文件中可以有多个类吗?(内部类除外)有什么条件?带着这个疑惑,动手建几个测试类, 揭开心中的疑惑.以下是解开疑惑过程: package test;/** * 一个.java源文件中可以 ...

  8. Siebel Tools client安装假死在92%问题解决

    Solution to this error: This issue happens incase of installation is on unsupported operating system ...

  9. 免费的SSL证书,你值得拥有!Let's Encrypt 试用体验记录

    早上收到 Let’s Encrypt 的邮件,说偶之前申请的已经通过了,于是马上开始试用.Let’s Encrypt 是一个新的数字证书认证机构,它通过自动化的过程消除创建和安装证书的复杂性,为网站提 ...

  10. pip下载太慢解决方法

    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ --upgrade tensorflow 用清华的镜像下载会快很多.