10-python面向对象的编程(OOP)

Python面向对象的编程

  • 面向对象的程序设计(Onject-oriented programming,OOP)
  • 面向过程的程序设计(Process-oriented programming,POP)

1. 1 对象(Object):将属性和方法封装在一起

10-python面向对象的编程(OOP)10-python面向对象的编程(OOP)

1.2 类(class):具有相同的属性和方法的对象集合。

  • 对象是类的实例
  • 子类继承了父类的全部属性和方法,并且也有自己特有的属性和方法
  • 继承描述了类之间的层次关系
  • 类和对象并非仅限于具体的事物,它也可以是一种抽象的概念或者规则10-python面向对象的编程(OOP)

1.3 类属性

  • 类属性是类中所有对象共同拥有的属性
  • 它在内存中只存在一个副本
  • 可以通过类名访问,也可以被类的所有对象访问
  • 在类定义之后,可以通过类名添加类属性,新增的类属性也被类和所有对象共有
    10-python面向对象的编程(OOP)

1.4 声明类

  • 10-python面向对象的编程(OOP)

  • 方法中必须有一个参数self,而且它是参数列表中的第一个参数

  • 由同一个类可以生成很多个对象,每一个对象,都有一个专属的self,代表这个对象自身

class Person():
    money=10086
    def say_hello(self):
        print("hello!")

1.5 创建对象

对象名 = 类名()

class Person():
    money=200000000
    def say_good(self):
        print("Good Luck!")

xiaoxu = Person()

print(xiaoxu.money)
xiaoxu.say_good()

运行结果:

PS G:\Codes\PyStudy> python -u "g:\Codes\PyStudy\02\Person.py"
200000000
Good Luck!
  • 创建对象之后,动态添加对象属性
class Person():
    money=200000000
    def say_good(self):
        print("Good Luck!")

xiaoxu = Person()

#创建对象之后,动态添加对象属性
xiaoxu.major="computer"
print("xiaoxu’s major is",xiaoxu.major)

运行结果:

PS G:\Codes\PyStudy> python -u "g:\Codes\PyStudy\02\Person2.py"
xiaoxu’s major is computer

该动态添加的实例属性,它只属于xiaoxu自己,如果重新创建其他的Person()对象,是没有这个属性的。

例如在以上的代码前提下,在末尾添加上这两行代码再次进行测试:

laowang = Person()
print(laowang.major)

运行结果:

PS G:\Codes\PyStudy> python -u "g:\Codes\PyStudy\02\Person3.py"
xiaoxu’s major is computer
Traceback (most recent call last):
  File "g:\Codes\PyStudy\02\Person3.py", line 17, in <module>
    print(laowang.major)
AttributeError: 'Person' object has no attribute 'major'

1.6 测试类属性特性

  • 类属性,所有的实例共同享有
  • 修改类属性,所有实例的值都会发生变化
  • 某一对象,自行修改类属性,那么其他对象无法获取该类属性的值
class Person():
    # 类属性,所有的示例共同享有
    money=200000000
    def say_good(self):
        print("Good Luck!")

xiaoxu = Person()
laowang = Person()

print(Person.money)
print(xiaoxu.money)
print(laowang.money)
print("------------分割线-------------")

# 修改类属性,所有实例的值都会发生变化
Person.money=400000

print(Person.money)
print(xiaoxu.money)
print(laowang.money)
print("------------分割线-------------")

# 小徐自行创建的实例属性,它就不会被共享
xiaoxu.money=1200000

print(Person.money)
print(xiaoxu.money)
print(laowang.money)

1.7 删除对象

del 对象名

  • 在执行完这条语句后,该对象就不存在了,如果再访问该对象,就会出现错误提示
class Person():
    money=1200000
    def say_good(self):
        print("Good Luck!")

xiaoxu = Person()
xiaoxu.major="computer"
print("xiaoxu’s major is",xiaoxu.major)

del xiaoxu
print(xiaoxu.major)

执行结果:

PS G:\Codes\PyStudy> python -u "g:\Codes\PyStudy\02\Person5.py"
xiaoxu’s major is computer
Traceback (most recent call last):
  File "g:\Codes\PyStudy\02\Person5.py", line 11, in <module>
    print(xiaoxu.major)
NameError: name 'xiaoxu' is not defined

1.8 构造函数和析构函数

  • 构造函数:再创建对象时,用来完成初始化操作
    • init(self,参数2,参数3,…)
    • 当创建对象时,系统会自动调用构造函数。
    • 可以把对成员变量赋初值的语句写在构造函数中,从而保证每个变量都有合适的初始值。
  • 析构函数:在清除对象时,回收和释放对象所占用的资源。
    • del()
  • 在Python中,构造函数和析构函数可省略
class Person:
    # 构造函数 -- __init__()
    # 在创建对象时,用来完成初始化操作
    def __init__(self,name,age,gender="男"):
        self.name=name
        self.age=age
        self.gender=gender
    # 析构函数 -- __del__()
    # 在清除对象时,回收和释放对象所占用的资源
    def __del__(self):
        print("Bye bye - from",self.name)
    def printInfo(self):
        print("姓名:",self.name,"年龄:",self.age,"性别:",self.gender)

xiaoxu=Person("小徐",21)
xiaofang=Person("小芳",18,"女")

xiaoxu.printInfo()
xiaofang.printInfo()

del xiaoxu
del xiaofang

运行结果:

PS G:\Codes\PyStudy> python -u "g:\Codes\PyStudy\02\Person6.py"
姓名: 小徐 年龄: 21 性别: 男
姓名: 小芳 年龄: 18 性别: 女
Bye bye - from 小徐
Bye bye - from 小芳

1.9 静态方法和类方法

10-python面向对象的编程(OOP)

"""
类方法:
    可以通过类名或对象名调用。
     不能访问实例属性,但可以访问类属性。
静态方法:
    可以通过类名或对象名调用。
    不能访问实例属性,也不能直接访问类属性。
    但是可以通过类名引用类属性。
"""
class Person():
    @classmethod
    def eat(self,name):
        self.name = name
        print("吃了两碗米饭的",self.name)
    @staticmethod
    def drink():
        print("一口气喝了1.5升的有点甜")

laowang = Person()

laowang.eat("我")
laowang.drink()

运行结果:

PS G:\Codes\PyStudy> python -u "g:\Codes\PyStudy\02\Person7.py"
吃了两碗米饭的 我
一口气喝了1.5升的有点甜

1.10 公有变量和私有变量

10-python面向对象的编程(OOP)

1.11 继承(inheritance)

  • 子类能够继承父类中所有非私有的成员变量和成员函数。

10-python面向对象的编程(OOP)

class Person():
    money=10086
    def say_hello(self):
        print("hello!")

# 继承 - Teacher是Person的子类
# 子类能够继承父类中所有非私有的成员变量和成员函数
class Teacher(Person):
    pass

amy = Teacher()

print(amy.money)
amy.say_hello()

运行结果:

PS G:\Codes\PyStudy> python -u "g:\Codes\PyStudy\02\tempCodeRunnerFile.py"    
10086
hello!
上一篇:OOP-面向对象程序设计七大原则


下一篇:javaSpringboot基础一