1.面向对象(OOP)
- 万物皆对象,对象拥有自己的特征和行为
- 有些对象是具有相同特征和行为的,我们可以将其抽象为类
- 类是对象的类型,具有相同的属性和行为
- 类是抽象的,在使用时通常会找到这个类的一个具体存在
1.1)类和对象的关系
- 类是对象的类型,对象是类的实例。类是抽象的概念,而对象是一个你能够摸得着看得到的实体。二者相辅相成,谁也离不开谁
- 类实例化成对象
2.定义类
2.1)类的构成
- 类由三个部分组成
- 类的名称:类型
- 属性:对象的属性
- 方法:对象的方法
2.2)创建和使用类
- 定义一个类的语法:
- class 类名:
- 属性列表
- 方法列表
代码
class Animal():
# 属性:种类,姓名
def __init__(self,types,name,shouts):# 初始化 self表示实例后对象的本身
self.name = name
self.types = types
self.shouts = shouts
# 方法:叫
def shout(self):
print("%s,%s,%s"%(self.types,self.name,self.shouts)) # %s表示占位符,与后面()内的参数一一对应
dog1 = Animal('泰迪','小黑','汪汪叫')
dog1.shout()
cat1 = Animal('波斯','小黄','喵喵叫')
cat1.shout()
运行结果
![这里写图片描述](https://img-blog.csdn.net/20180112184300529?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGF5Y3lt/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
2.3)init()构造方法和self
- init()是一个特殊的方法,方法前后都有两个下划线。
- init()方法都会默认被运行
- 作用是初始化已实例化后的对象(每次实例化后都会自动调用)
- 在方法定义时,第一个参数self是必不可少的。类的方法和普通的函数的区别就是self,self不是python的关键字,可以用其他单词取代,只是按照惯例和标准的规定,推荐使用self
代码
class Animal():
# 属性:种类,姓名
def __init__(self,types,name,shouts):# 初始化 self表示实例后对象的本身
self.name = name
self.types = types
self.shouts = shouts
print("构造方法调用")
# 方法:叫
def shout(self):
print("%s,%s,%s"%(self.types,self.name,self.shouts)) # %s表示占位符,与后面()内的参数一一对应
dog1 = Animal('泰迪','小黑','汪汪叫')
dog1.shout()
cat1 = Animal('波斯','小黄','喵喵叫')
cat1.shout()
运行结果
![这里写图片描述](https://img-blog.csdn.net/20180112184312639?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGF5Y3lt/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
3.继承和多态
3.1)单继承
代码
class Animal():
def shout(self):
print("汪汪叫")
# 单层继承
class Dog(Animal): #继承父类
pass
dog = Dog()
dog.shout()
# 多层继承
class Taidi(Dog): # 继承父类的父类
pass
taidi = Taidi()
taidi.shout()
运行结果
![这里写图片描述](https://img-blog.csdn.net/20180112184323687?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGF5Y3lt/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
3.2)重写父类方法
代码
# 重写
class Animal():
def shout(self):
print("汪汪叫")
def eat(self):
pass
class Dog(Animal):
pass
class Taidi(Dog):
pass
class Cat(Animal):
def shout(self):
print("喵喵叫")
cat = Cat()
cat.shout()
运行结果
![这里写图片描述](https://img-blog.csdn.net/20180112184334803?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGF5Y3lt/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
3.3)多继承
- 语法
- class 类名(Base1,Base2,Base3)
- 属性
- 方法
- 需要注意圆括号中父类的顺序,如果继承父类中有相同的方法名,而子类中使用时未指定,python将从左到右查找父类中的是否包含该方法
代码
# 多继承
class Animal():
def shout(self):
print("喵喵叫")
class Dog():
def shout(self):
print("汪汪叫")
class Taidi(Dog,Animal):
pass
taidi = Taidi()
taidi.shout()
class Taidi(Animal,Dog):
pass
taidi = Taidi()
taidi.shout()
运行结果
![这里写图片描述](https://img-blog.csdn.net/20180112184345581?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGF5Y3lt/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
4.类属性和方法
4.1)私有属性
代码
# 私有属性(前面加两个下划线)
class Person():
# def __init__(self):
# self.__name = '小明'
def set_name(self):
self.__name = '小明'
def get_name(self):
return self.__name
# def set_age(self,new_age):
# if new_age>0 and new_age<100:
# self.age = new_age
# else:
# self.age = 18
# def get_age(self):
# return self.age
xiaoming = Person()
# xiaoming.age = 10
# xiaoming.set_age(10)
# age = xiaoming.get_age()
# print(age)
# print(xiaoming.__name) 如果用__init__()初始化私有属性,会报错
xiaoming.set_name()
name = xiaoming.get_name()
print(name)
运行结果
![这里写图片描述](https://img-blog.csdn.net/20180112184355761?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGF5Y3lt/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
4.2)私有方法(前面加两个下划线)
代码
class Person():
def __eat(self):
print("这是私有方法:__eat()")
def get_eat(self):
self.__eat()
xiaoming = Person()
# xiaoming.__eat() 访问私有方法会报错
xiaoming.get_eat()
运行结果
![这里写图片描述](https://img-blog.csdn.net/20180112184406582?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGF5Y3lt/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
4.3)继承中使用私有属性和私有方法
代码
class Preson():
def __init__(self):
self.__name = '小明'
self.age = 10
def test1(self):
print("----test1----")
def __test2(self):
print("----test2----")
def test3(self):
self.__name
self.__test2()
class xiaoming(Preson):
pass
# def test3(self):
# self.__name 私有属性不能被继承
# self.__test2() 私有方法不能被继承
xiaoming1 = xiaoming()
xiaoming1.test3()
运行结果
![这里写图片描述](https://img-blog.csdn.net/20180112184420069?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGF5Y3lt/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
4.4)实例属性和类属性
代码
class Person():
# 属性
num = 0 # 类属性
def __init__(self):
self.name = '小明' # 实例属性
Person.num += 1 # 类属性通过类名.
# 方法
# 通过类创建的实例对象的个数
a = Person()
b = Person()
print(Person.num)
运行结果
![这里写图片描述](https://img-blog.csdn.net/20180112184428685?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGF5Y3lt/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
4.5)实例方法、类方法和静态方法
代码
# 实例方法、类方法和静态方法
class Animal():
# 类属性
num = 0
# 类名.num
# 实例方法
def __init__(self):
# 实例属性
self.name = '小明'
@classmethod # 类方法
def test1(cls):
# Animal.num = 100
cls.num = 100
print(cls.num)
@staticmethod # 静态方法
def test2():
print("欢迎进入宠物管理系统!")
animal = Animal()
# 通过实例对象调用
animal.test2()
animal.test1()
# 通过类名.调用
Animal.test2()
Animal.test1()
运行结果
![这里写图片描述](https://img-blog.csdn.net/20180112184437847?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGF5Y3lt/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)