美文网首页
Python基础-OOP

Python基础-OOP

作者: Yuanshuo | 来源:发表于2019-07-16 07:28 被阅读0次
The core values of Chinese socialism

OOP

  • 思想

    • 以模块化思想解决工程问题
    • 面向过程 VS 面向对象
    • 由面向过程转向面向对象
  • 常用名词

    • OO:面向对象
    • OOA:分析
    • OOD:设计
    • OOP:编程
    • OOI:实现
  • 类 VS 对象

    • 类:抽象,描述的是一个集合,侧重共性(学生)
    • 对象:具象,描述的是个体(张三)
  • 类的内容

    • 动作,函数
    • 属性,变量
  • is-a

  • 定义类:class关键字

  • 类命名:

    • 遵循大驼峰
    • 第一个字母大写
# 定义学生类,和几个学生

class Student():
    name = "Yuanshuo"
    age = 22
    
    def sayHi(self):
        print("Life is fantastic!")
        
        return None
    
# 实例化
Yuanshuo = Student()
print(Yuanshuo)
<__main__.Student object at 0x10fa46198>

self

  • self 可以用别的名称代替
  • self 不是关键字
  • 作用是指代本身
# self 举例

Yuanshuo = Student()

# Yuanshuo调用sayHi()没有输入参数
# 因为默认实例作为第一个参数传入
Yuanshuo.sayHi()
Life is fantastic!

类的变量作用域的问题

  • 类变量:属于类自己的变量
  • 实例变量: 属于实例的变量
  • 访问实例的属性,如果实例没有定义属性,则自动访问类的属性,如果类也没有定义,报错|
class Student():
    # name, age 是类的变量
    # 注意类的变量的定义位置和方法
    # 不需要前缀
    name = "Yuanshuo"
    age = 19
    
    def sayHi(self):
        print("My name is {}, I am {} years old.".format(self.name, self.age))
        return None

# 示例说明,实例变量可以借用类的变量
Yuanshuo = Student()
Yuanshuo.sayHi()
    
My name is Yuanshuo, I am 19 years old.
class Student():
    # name, age 是类的变量
    # 注意类的变量的定义位置和方法
    # 不需要前缀
    name = "Yuanshuo"
    age = 19
    
    def sayHi(self, n, a):
        self.name = n
        self.age = a
        print("My name is {}, I am {} years old.".format(self.name, self.age))
        return None

# 示例说明,
Yuanshuo = Student()
Yuanshuo.sayHi("Dapeng", 17)

# 如果访问实例的属性没有定义,则自动访问类的属性
# 如果类也没有定义,报错
print(Yuanshuo.wife())
My name is Dapeng, I am 17 years old.



---------------------------------------------------------------------------

AttributeError                            Traceback (most recent call last)

<ipython-input-5-4649390c3408> in <module>
     18 # 如果访问实例的属性没有定义,则自动访问类的属性
     19 # 如果类也没有定义,报错
---> 20 print(Yuanshuo.wife())


AttributeError: 'Student' object has no attribute 'wife'

访问类的属性

  • 在类里面如果强制访问类的属性,则需要使用class,class(注意前后两个下划线)
  • 类方法:
    • 定义类的方法的时候,没有self参数
    • 类方法中只允许使用类的内容
    • 两种用法
      • 类名称.属性
      • class.属性
class Student():
    # name, age 是类的变量
    # 注意类的变量的定义位置和方法
    # 不需要前缀
    name = "Yuanshuo"
    age = 19
    
    def sayHi(self):
        print("My name is {}, I am {} years old.".format(self.name, self.age))
        return None

    # SOS是类的方法
    # 如何访问类的变量
    # 但是调用需要用到特殊方法
    def SOS():
        # 类方法中不允许访问实例的任何内容
        # 如果访问类的内容,注意两种用法
        print("My name is {}, I am {} years old.".format(Student.name, __class__.age))
        return None
        
        
# 体验类的方法
Yuanshuo = Student()
Yuanshuo.sayHi()

# 调用类方法的例子
Student.SOS()
My name is Yuanshuo, I am 19 years old.
My name is Yuanshuo, I am 19 years old.

构造函数

  • 类在实例化的时候,执行一些基础性的初始化的工作
  • 使用特殊的名称和写法
  • 在实例化的时候自动调用
  • 实在实例化的时候第一个被执行的函数
  • 要求,第一个参数必须有, 一般推荐self
class Student():
    name = "NoName"
    age = 0
    
    # 构造函数名称固定,写法相对固定
    def __init__(self):
        print("我是构造函数")
        
Yuanshuo = Student()
print("----------")
print(Yuanshuo.name)
print(Yuanshuo.age)

我是构造函数
----------
NoName
0

面向对象的三大特征

  • 继承
  • 封装
  • 多态

继承

  • 子类可以使用父类定义的内容或者行为等
  • 所有类都必须有一个父类
    • 如果没有,则默认为是object的子类
    • 子类可以有多个父类
# 所有类必须有父类
# 默认是object
class Person1():
    pass

class Person2(object):
    pass

class Person():
    name = "NoName"
    age = 0
    
# 父类写在类定义的时候的括号里
class Teacher(Person):
    pass

t = Teacher()
print(t.name)
NoName
class Bird():
    fly = "We can fly."
    def flying(self):
        print("Flying!")
        
class BirdMan(Person, Bird):
    pass

bm = BirdMan()
bm.flying()
print(bm.name)
Flying!
NoName

issubclass检测是否是子类

- 可以用来检测两个类的父子关系
# 利用上面定义的Bird, Person, BridMan, Teacher检测父子关系

print(issubclass(BirdMan,Bird))
print(issubclass(BirdMan,Person))
print(issubclass(BirdMan,Teacher))
print(issubclass(Teacher,Person))
True
True
False
True

构造函数的继承

  • 构造函数默认继承,子类如果没有构造函数,则自动调用父类的构造函数
  • 一旦子类定义了构造函数,则不再自动调用父类的构造函数
class Person:
    def __init__(self, name, age):
        print("Person=({},{})".format(name, age))
        
class Teacher(Person):
    pass

t = Teacher("Yuanshuo", 19)
t = Teacher()

Person=(Yuanshuo,19)



---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-33-42c7a2d76a67> in <module>
      7 
      8 t = Teacher("Yuanshuo", 19)
----> 9 t = Teacher()


TypeError: __init__() missing 2 required positional arguments: 'name' and 'age'

相关文章

  • python - OOP基础

    前言 OOP的概念就不说了,想必都很了解了。 Oop的三大特点:继承、封装和多态。python作为动态语言的一种,...

  • Python基础-OOP

    OOP 思想以模块化思想解决工程问题面向过程 VS 面向对象由面向过程转向面向对象 常用名词OO:面向对象OOA:...

  • python面向对象学习笔记-01

    学习笔记 # 0,OOP-Python面向对象 - Python的面向对象 - 面向对象编程 - 基础 -...

  • 【知识详解】JAVA基础(秋招总结)

    JAVA基础 目录 JAVA基础 问:面向过程(POP)和面向对象(OOP)? 问:Python和Java的区别?...

  • Python OOP-1

    0. OOP-Python面向对象 Python面向对象 面向对象编程基础公有私有继承组合,Mixin 魔法函数魔...

  • OOP基础

    OOP一.概述(object oriented programming面向对象编程) --PHP是混合类型的语言 ...

  • Python OOP

    断断续续写了几年程序,终于接触到面向对象的编程方式。本文记录与以往编程体验不同的地方 数据和逻辑被封装: 1. 操...

  • Python OOP

    面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分...

  • ❖ Python OOP 面向对象编程

    参考:黑马程序员教程 - Python基础 面向对象 OOP三大特性,且三个特性是有顺序的: 封装 继承 多态 封...

  • Python学习总结

    Python概述 数据类型 数据结构 OOP FP

网友评论

      本文标题:Python基础-OOP

      本文链接:https://www.haomeiwen.com/subject/lamnkctx.html