Python OOP面向对象编程

OOP

  • 思想:

    • 以模块思想解决工程问题
    • 面向过程 VS 面向对象
    • 由面向过程转向面向对象
    • 例子,我要开一个学校,叫XXX
      • 讲师
      • 学生
      • 班主任
      • 教室
      • 学校
  • 常用名词

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

    • 类:抽象,描述的是一个集合,侧重于共性
    • 对象:具象,描述的是个体
  • 类的内容:

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

  • 定义类:class关键字

  • 类命名:

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

class Student():
    # 此处定义一个空类
    # passs是关键字,表示占位用的,无意义
    pass

class StudnetNoPass():
    pass
# 定义一个对象
xxxxxbai = Student()
# 
class PythonStudent():
    name =  "yegeli"
    age = 18
    course = "Python"
    '''
    定义类中的函数
    一般需要有self关键字
    其余跟普通函数基本相同
    '''
    def giveMeMOney(self):
        print("Show me the money")
        return None
    
xiaobai = PythonStudent()
print(xiaobai.name)
print(xiaobai.age)
print(xiaobai.course)
yegeli
18
Python

类的属性

# 类的例子
# 注意类的定义
class Student():
    # name,age是类的变量
    # 注意类的变量的定义位置和方法
    # 不需要前缀
    name = "野哥李"
    age =19
    
    # 类的实例方法
    def sayHi(self):
        print("类,动作")
        return None
    
    # self可以更换名字
    def sayHai(meme):
        print("爱咪咪")
                
# 实例化
# 中文能当做变量名称
野哥 = Student()
print(野哥)
print(野哥.name)
<__main__.Student object at 0x0199ADB0>
野哥李

self

  • self可以用别的名称代替
  • self不是关键字
  • 作用是指代本身
# self举例
# 实例调用函数
yaoyao = Student()
# 让yaoyao跟我打声招呼
# 因为默认实例作为第一个参数传入
yaoyao.sayHi()

# 错误的案例
a = "三钠"
yaoyao.sayHi(a)
类,动作



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

TypeError                                 Traceback (most recent call last)

<ipython-input-36-a7e3277fa362> in <module>()
      8 # 错误的案例
      9 a = "三钠"
---> 10 yaoyao.sayHi(a)


TypeError: sayHi() takes 1 positional argument but 2 were given
# 参看sayHai的定义,说明self的名称可更改
yaoyao.sayHai()
爱咪咪

类的变量作用域的问题

  • 类变量:属于类自己的变量
  • 实例变量:属于实例的变量
  • 访问实例的属性,如果实例没有定义属性,则自动访问类的属性,如果类也没有定义,报错
# 注意类的定义
class Student():
    # name,age是类的变量
    # 注意类的变量的定义位置和方法
    # 不需要前缀
    name = "野哥李"
    age =19
    
    def sayHi(self):
        print("My name is {}, i am {} years old".format(self.name,self.age))
        return None
    
# 以下案例说明,实例变量可以借用类的变量  
erjing = Student()
erjing.sayHi()
My name is 野哥李, i am 19 years old
# 注意类的定义
class Student2():
    # name,age是类的变量
    # 注意类的变量的定义位置和方法
    # 不需要前缀
    name = "野哥李"
    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
    
# 以下案例说明,实例变量可以借用类的变量  
erjing = Student2()
# 注意观察下面语句打开和关闭后的区别
erjing.sayHi("erjing", 17)
print("My name is {}, i am {} years old".format(Student2.name,Student2.age))
print("My name is {}, i am {} years old".format(erjing.name,erjing.age))
# 如果访问实例的属性没有定义,则自动访问类的属性
# 如果类也没有定义,报错
print(ering.father)
My name is erjing, i am 17 years old
My name is 野哥李, i am 19 years old
My name is erjing, i am 17 years old



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

NameError                                 Traceback (most recent call last)

<ipython-input-1-d8fc2922a91b> in <module>()
     21 # 如果访问实例的属性没有定义,则自动访问类的属性
     22 # 如果类也没有定义,报错
---> 23 print(ering.father)


NameError: name 'ering' is not defined

访问类的属性

  • 在类里面如果强制访问类的属性,则需要使用 class ,(注意前后两个下划线)
  • 类方法:
    • 定义类的方法的时候,没有self参数

    • 类的方法中只允许用类的内容

    • 两种用法

      ClassName :类名
      __class__:两个下划线class两个下划线
      
class Student():
    # name,age是类的变量
    # 注意类的变量的定义位置和方法
    # 不需要前缀
    name = "野哥李"
    age =19
    
    # sayHi是实例传参的方法,它有默认的传参self,把实例传进来
    def sayHi(self):
     
        print("My name is {}, i am {} years old".format(self.name,self.age))
        return None
    # sos是类的方法,它不把实例传进来
    # 调用需要用到特殊的方法
    def sos():
        # 方法中不允许访问实例的任何内容 
        # 如果访问类的内容,注意两种方法,类名及两个下划线class两个下划线
        print("My name is {}, i am {} years old".format(Student.name,__class__.age))
        return None
# 体验类的方法
s = Student()
s.sayHi()
# 调用类方法的例子
# 直接用类的名称调用
Student.sos()
# 类的方法与实例传参的方法对比:
s.sos()
My name is 野哥李, i am 19 years old
My name is 野哥李, i am 19 years old



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

TypeError                                 Traceback (most recent call last)

<ipython-input-33-0b52ebf4caa5> in <module>()
      6 Student.sos()
      7 
----> 8 s.sos()


TypeError: sos() takes 0 positional arguments but 1 was given

构造函数

  • 类在实例化的时候,执行一些基础性的初始化工作
  • 使用特殊的名称和写法
  • 在实例化的时候自动执行
  • 是在实例化的时候第一个被执行的函数
 # 注意类的定义
class Student():
    name = "NoName"
    age = 0
    
    # 构造函数名称固定,写法相对固定
    def __init__(self):
        print("我是构造函数")
        

erjing = Student()
print("-------------")
print(erjing.name)
print(erjing.age)
我是构造函数
-------------
NoName
0
posted @ 2021-03-01 07:12  野哥李  阅读(2)  评论(0编辑  收藏  举报  来源