Python面向对象的编程
- 面向对象的程序设计(Onject-oriented programming,OOP)
- 面向过程的程序设计(Process-oriented programming,POP)
1. 1 对象(Object):将属性和方法封装在一起
1.2 类(class):具有相同的属性和方法的对象集合。
- 对象是类的实例。
- 子类继承了父类的全部属性和方法,并且也有自己特有的属性和方法。
- 继承描述了类之间的层次关系。
- 类和对象并非仅限于具体的事物,它也可以是一种抽象的概念或者规则。
1.3 类属性
- 类属性是类中所有对象共同拥有的属性
- 它在内存中只存在一个副本
- 可以通过类名访问,也可以被类的所有对象访问
- 在类定义之后,可以通过类名添加类属性,新增的类属性也被类和所有对象共有。
1.4 声明类
-
方法中必须有一个参数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 静态方法和类方法
"""
类方法:
可以通过类名或对象名调用。
不能访问实例属性,但可以访问类属性。
静态方法:
可以通过类名或对象名调用。
不能访问实例属性,也不能直接访问类属性。
但是可以通过类名引用类属性。
"""
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 公有变量和私有变量
1.11 继承(inheritance)
- 子类能够继承父类中所有非私有的成员变量和成员函数。
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!