面向对象的编程(objected oriented programming)
简称OOP,是一种编程的思想。OOP把对象当成一个程序的基本单元,一个对象中包含了数据和操作数据的函数。面向对象极大地提升了编程效率,使编程的重用性增高。
- 多态:一个函数有多种表现形式,调用一个方法有多种形式,但是表现出的方法是不一样的
- 继承:子项继承父项的某些功能,在程序中表现某种联系
- 封装:把需要重用的函数或功能封装,方便其他程序直接调用
- 类:对具有相同数据或者方法的一组对象的集合
- 对象:对象是类的一个具体实例
1、封装
封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容
对于面向对象的封装而言,其实就是使用构造方法将内容封装到对象中,然后通过对象直接或者self间接获取被封装的内容。
class wzy:
def __init__(self,name,age,major):
self.name = name
self.age = age
self.major = major
def learn(self):
print(f"{self.name} is learning {self.major}")
def love(self):
print(f"{self.name} is {self.age} years old, it's time to love")
hmz = wzy("hmz",21,"Dig Data")
hmz.learn()
2、继承
继承,面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容
- 子类如果不重写__init__,在实例化子类时会自动调用父类定义的__init__。
- 子类如果重写了__init__,在实例化子类时就不会再调用父类定义的__init__,此时需要引入super将父类变量进行传入
class wzy:
def __init__(self,name,age,major):
self.name = name
self.age = age
self.major = major
def learn(self):
print(f"{self.name} is learning {self.major}")
def love(self):
print(f"{self.name} is {self.age} years old, it's time to love")
class hmz(wzy):
def __init__(self, name, age, major,score):
# 只用显示传入的变量名即可
super().__init__(name, age, major)
self.score = score
def juan(self,name):
print(f"I will get {self.score} and juansi {name}")
hmz = hmz("hmz",21,"Dig Data",100)
hmz.juan('wzy')
3、面向对象的各种方法
3.1 静态方法(@staticmethod)
使用@staticmethod将下面的函数和所属的类截断了,这个函数不属于这个类,没有类的属性,不过还是需要通过类名进行调用。
class demo:
def __init__(self,name):
self.name = name
#使用staticmethod方法之后相当于下面的函数和self中的定义将无关,不能再使用self
@staticmethod
def hello(name):
print(f"{self.name} say hello to {name}")
w = demo("wzy")
w.hello("hmz")
3.2 类方法(@classmethod)
类方法只能访问类变量,不能访问实例变量
class person:
attribute = "person"
def __init__(self,name,age,gender,attribute):
self.name = name
self.age = age
self.gender = gender
self.attribute = attribute
@classmethod
#只能访问类中自定义的属性名称
def say(self):
# print(f"I am a {self.age}")
print(f"I am a {self.attribute}")
p = person("wzy",19,'male',12)
p.say()
- 补充:在预定义类中加入object时继承了类中全部高阶功能,而不加object则仅包含自定义功能和低阶功能。
3.3 属性方法(@property)
把一个方法变成一个静态属性,属性就不用再加小括号了.
class Person(object):
def __init__(self,name):
self.name = name
@property
def eat(self):
print(f"{self.name} is eating")
p = Person("wzy")
p.eat
4、高级面向对象
#### 4.1 成员修饰符
python的类中只有公有成员和私有成员两种,在python中没有关键字去修饰成员,默认的所有成员都是公有成员,但是私有成员是以两个下划线开头的名字以标识私有成员,私有成员不能直接访问,只能通过内部方法进行调用,私有成员也不能被继承。
class b(a):
def __init__(self,name):
super(b,self).__init__()
self.name = name
@property
def show(self):
print(f"self.name = {self.name}")
#下一行会报错,因为私有变量不能被继承
# print(f"self.__age = {self.__age}")
print(f"self.ge = {self.ge}")
obj = b('wzy')
obj.show
4.2特殊成员
-
__init__:类的构造方法
-
__del__:类中的析构方法(默认不用写)