‘壹’ python之什么叫面向对象
面向对象是向现实世界模型的自然延伸,这是一种“万物皆对象”的编程思想。在现实生活中的任何物体都可以归为一类事物,而每一个个体都是一类事物的实例。面向对象的编程是以对象为中心,以消息为驱动,所以程序=对象+消息。
面向对象有三大特性,封装、继承和多态。
封装就是将一类事物的属性和行为抽象成一个类,使其属性私有化,行为公开化,提高了数据的隐秘性的同时,使代码模块化。这样做使得代码的复用性更高。
相关推荐:《Python视频教程》
继承则是进一步将一类事物共有的属性和行为抽象成一个父类,而每一个子类是一个特殊的父类--有父类的行为和属性,也有自己特有的行为和属性。这样做扩展了已存在的代码块,进一步提高了代码的复用性。
如果说封装和继承是为了使代码重用,那么多态则是为了实现接口重用。多态的一大作用就是为了解耦--为了解除父子类继承的耦合度。如果说继承中父子类的关系式IS-A的关系,那么接口和实现类之之间的关系式HAS-A。简单来说,多态就是允许父类引用(或接口)指向子类(或实现类)对象。很多的设计模式都是基于面向对象的多态性设计的。
总结一下,如果说封装和继承是面向对象的基础,那么多态则是面向对象最精髓的理论。掌握多态必先了解接口,只有充分理解接口才能更好的应用多态。
‘贰’ Python面向对象编程之继承与多态详解
Python面向对象编程之继承与多态详解
本文实例讲述了Python面向对象编程之继承与多态。分享给大家供大家参考,具体如下:
Python 类的继承
在OOP(Object Oriented Programming)程序设计中,当我们定义一个class的时候,可以从某个现有的class 继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。
我们先来定义一个class Person,表示人,定义属性变量 name 及 sex (姓名和性别);
定义一个方法print_title():当sex是male时,print man;当sex 是female时,print woman。参考如下代码:
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
def print_title(self):
if self.sex == "male":
print("man")
elif self.sex == "female":
print("woman")
class Child(Person): # Child 继承 Person
pass
May = Child("May","female")
Peter = Person("Peter","male")
print(May.name,May.sex,Peter.name,Peter.sex) # 子类继承父类方法及属性
May.print_title()
Peter.print_title()
而我们编写 Child 类,完全可以继承 Person 类(Child 就是 Person);使用 class subclass_name(baseclass_name) 来表示继承;
继承有什么好处?最大的好处是子类获得了父类的全部属性及功能。如下 Child 类就可以直接使用父类的 print_title() 方法
实例化Child的时候,子类继承了父类的构造函数,就需要提供父类Person要求的两个属性变量 name 及 sex:
在继承关系中,如果一个实例的数据类型是某个子类,那它也可以被看做是父类(May 既是 Child 又是 Person)。但是,反过来就不行(Peter 仅是 Person,而不是Child)。
继承还可以一级一级地继承下来,就好比从爷爷到爸爸、再到儿子这样的关系。而任何类,最终都可以追溯到根类object,这些继承关系看上去就像一颗倒着的树。比如如下的继承树:
isinstance() 及 issubclass()
Python 与其他语言不同点在于,当我们定义一个 class 的时候,我们实际上就定义了一种数据类型。我们定义的数据类型和Python自带的数据类型,比如str、list、dict没什么两样。
Python 有两个判断继承的函数:isinstance() 用于检查实例类型;issubclass() 用于检查类继承。参见下方示例:
class Person(object):
pass
class Child(Person): # Child 继承 Person
pass
May = Child()
Peter = Person()
print(isinstance(May,Child)) # True
print(isinstance(May,Person)) # True
print(isinstance(Peter,Child)) # False
print(isinstance(Peter,Person)) # True
print(issubclass(Child,Person)) # True
Python 类的多态
在说明多态是什么之前,我们在 Child 类中重写 print_title() 方法:若为male,print boy;若为female,print girl
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
def print_title(self):
if self.sex == "male":
print("man")
elif self.sex == "female":
print("woman")
class Child(Person): # Child 继承 Person
def print_title(self):
if self.sex == "male":
print("boy")
elif self.sex == "female":
print("girl")
May = Child("May","female")
Peter = Person("Peter","male")
print(May.name,May.sex,Peter.name,Peter.sex)
May.print_title()
Peter.print_title()
当子类和父类都存在相同的 print_title()方法时,子类的 print_title() 覆盖了父类的 print_title(),在代码运行时,会调用子类的 print_title()
这样,我们就获得了继承的另一个好处:多态。
多态的好处就是,当我们需要传入更多的子类,例如新增 Teenagers、Grownups 等时,我们只需要继承 Person 类型就可以了,而print_title()方法既可以直不重写(即使用Person的),也可以重写一个特有的。这就是多态的意思。调用方只管调用,不管细节,而当我们新增一种Person的子类时,只要确保新方法编写正确,而不用管原来的代码。这就是着名的“开闭”原则:
对扩展开放(Open for extension):允许子类重写方法函数
对修改封闭(Closed for modification):不重写,直接继承父类方法函数
子类重写构造函数
子类可以没有构造函数,表示同父类构造一致;子类也可重写构造函数;现在,我们需要在子类 Child 中新增两个属性变量:mother 和 father,我们可以构造如下(建议子类调用父类的构造方法,参见后续代码):
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
class Child(Person): # Child 继承 Person
def __init__(self,name,sex,mother,father):
self.name = name
self.sex = sex
self.mother = mother
self.father = father
May = Child("May","female","April","June")
print(May.name,May.sex,May.mother,May.father)
若父类构造函数包含很多属性,子类仅需新增1、2个,会有不少冗余的代码,这边,子类可对父类的构造方法进行调用,参考如下:
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
class Child(Person): # Child 继承 Person
def __init__(self,name,sex,mother,father):
Person.__init__(self,name,sex) # 子类对父类的构造方法的调用
self.mother = mother
self.father = father
May = Child("May","female","April","June")
print(May.name,May.sex,May.mother,May.father)
多重继承
多重继承的概念应该比较好理解,比如现在需要新建一个类 baby 继承 Child , 可继承父类及父类上层类的属性及方法,优先使用层类近的方法,代码参考如下:
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
def print_title(self):
if self.sex == "male":
print("man")
elif self.sex == "female":
print("woman")
class Child(Person):
pass
class Baby(Child):
pass
May = Baby("May","female") # 继承上上层父类的属性
print(May.name,May.sex)
May.print_title() # 可使用上上层父类的方法
class Child(Person):
def print_title(self):
if self.sex == "male":
print("boy")
elif self.sex == "female":
print("girl")
class Baby(Child):
pass
May = Baby("May","female")
May.print_title() # 优先使用上层类的方法
‘叁’ Python中的面向对象(进阶)
一、实例方法,类方法,静态方法
我们首先写一个类,里面包含这三种方法。
可以看到,我们用到了两个装饰器。
我们用类和实例分别调用下类方法
我们用类和实例分别调用下静态方法
静态方法其实就是把一个普通的函数写在类里,与直接在外层写一个函数是一样的,本质上是一个函数。
为了方便理解,我们分别打印下这些方法的类型
通过type()查看对象是方法还是函数
此外,还可以通过inspect模块判断某个对象是否是某种类型,返回布尔值。
用法
小Tips:概念理解
直接def定义的,我们叫做函数
把函数放到类里,我们叫做方法
方法可以通过装饰器staticmethod转为(放在方法里的)函数
继承
一个类继承另一个类时,会自动获得另一个类的所有属性和方法,被继承的类称之为父类,新类称为子类。子类拥有父类所有的属性和方法,并且可以定义自己的属性和方法
我们以上边的Rectangle类为父类来试一下
1)完全继承
可以看到,子类完全继承父类后,可以直接调用父类的所有方法。
2)部分继承
部分继承:继承父类后,修改父类的同名方法
我们试一下,Square继承Rectangle后,修改__init__()方法
3)拓展父类的方法
在保留父类中某个方法的代码同时,对方法进行拓展
可以在方法中加入"super().方法名"来实现
4)@property
‘肆’ python 面向对象基础
class Test:
def setdata(self, value):
self.data = value
def display(self):
print self.data
x = Test()
y = Test()
x.setdata("test")
y.setdata(123456)
x.display()
y.display()
=======================
x.setdata = "test"
y.setdata = 123456
修改为
x.setdata("test")
y.setdata(123456)
这样就行了。
原因是Test对象中没有setdata属性,只有setdata方法,方法是通过setdata()这种形式调用的。
希望能对你有所帮助!
‘伍’ python面向对象编程题
父类省份,子类地级城市继承父类
地级城市属性:姓名、商品数量、基金数目
地级城市方法:买,对应功能1;卖,对应功能2
主方法中包含变量:自己(qinshihuang),周边市供应商(liubang),买家(hanxin),利润期望
随机变量是商品销售数
初始状态是先从供应商买走4件商品,然后关键在于被退回的商品是否算作售出(涉及到公式的内容)
‘陆’ python之面向对象
面向对象(OOP)是一种对现实世界理解和抽象的方法,对象的含义是指在现实生活中的具体事物, 一切皆对象 ,Python 是一门面向对象的语言,面向对象编程简单来说就是一种 封装代码 的方式。
Python 中类的定义使用 class 关键字定义类,语法如下所示:
举例,定义一个类 Cat
构造方法 init() 会在类实例化时自动调用。无论构造方法还是其他方法都需要将 self 作为第一个参数,它代表类的实例。
类创建好后,可以直接通过类名访问属性,格式为: 类名.属性名 ,比如我们访问 Cat 类的 color 属性,如下所示:
创建对象也称类的实例化,比如我们通过 Cat 类创建对象,如下所示:
创建好对象后,使用它访问属性和调用方法了,如下所示:
内部私有属性和方法是可以被访问和调用的。
我们来一起看个例子,如下所示:
输出结果:
Python 支持类的继承,而且支持多继承,语法格式为:
示例如下所示:
如果继承的父类方法不能满足我们的需求,这时子类可以 重写 父类方法,如下所示:
‘柒’ Python面向对象编程题
classTime:
def__init__(self,hours,minutes,seconds):
self.__hours=hours
self.__minutes=minutes
self.__seconds=seconds
defhours(self):
returnself.__hours
defminutes(self):
returnself.__minutes
defseconds(self):
returnself.__seconds
def__add__(self,other):#定义加法行为
pass
def__sub__(self,other):#定义减法行为
pass
def__eq__(self,other):#定义等于号行为
pass
def__lt__(self,other):#定义小于号行为
pass
写出大致框架,自行完善后面的四个魔法方法
‘捌’ Python编程 面向对象程序设计
面向过程:根据业务逻辑从上到下写垒代码
函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
面向对象:对函数进行分类和封装,让开发“更快更好更强...”
面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,即:将之前实现的代码块复制到现需功能处。