面向对象编程是最有效的软件编写方法之一,在面向对象编程中,你编写表示现实世界中的事物和情景的类,并基于这些类来创建对象编写类时,你定义一大类对象都自动具备这种通用的行为,然后可根据需要赋予每个对象独特的个性,使用面向对象编程可模拟现实情景,从而达到你想要达到的目的。
本文将从面向对象中的类的实例、属性、方法、继承、多态多方面介绍python中的面向对象
面向对象编程技术名词的解释
-
类:用来描述具有相同的属性和方法对象的集合,定义了该集合中每个对象所共有的属性和方法,对象是类的实例
-
方法:类的函数称为方法
-
实例化:创建一个类的实例,类的具体对象
-
局部变量:定义在方法中的变量,只作用于当前实例的类
-
实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用self修饰的变量
-
对象:通过定义的数据结构实例,对象包含类变量和实例变量
-
继承:一个派生类继承基类的字段和方法
-
多态:对不同类的对象使用同样的操作
-
封装:对外部世界隐藏对象的工作细节
类的创建和实例化
示例1:
# 类的定义
class Dog():
def __init__(self,name,age):
# 初始化属性name和age
self.name=name
self.age=age
# 上边的变量是类变量,值在这个类的所有实例中均可共享
def sit(self):
print(self.name+'is now setting')
def roll_over(self):
print(self.name+'rolled over!')
init()方法的解释:init()方法是一种特殊的方法,被称为类的构造函数或初始化方法,init初始化是魔法方法中的一种,用来初始化对象,在创建对象的时候,init方法会自动去调用。self代表类的实例,self在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。
创建实例
# 下面的Dog指的是类,而my_dog指的是根据类创建的实例
my_dog=Dog('tom',6)
访问属性
# 这里访问属性是类属性
print('my dog's name is'+my_dog.name+'.')
[out]:
my dog's name is tom
调用方法
# 调用方法
my_dog.sit()
my_dog.roll_over()
[out]:
tom is now setting
tom rolled over!
类的属性和方法
前面我们已经介绍了类的属性和方法,属性分为类属性和对象属性,而方法是类函数的统称。下面就仔细了解这两个概念
知识点1:类的属性
示例1:
class Dog():
# 类属性
name='tom'
age=12
def __init__(self,city)
# 对象属性
self.city=city
print('city is'+self.city)
def say(self):
print('hello world')
# 关于他们的调用方式
(1) 类属性可以通过'类名'+属性的方法来调用,print(Dog.name)
(2) 对象属性是不可以这样使用的,使用方式是如下所示:
d1=Dog()
d1.say()
提示:__private_attrs:两个下划线开头的,声明为该属性为私有,不能在类的外部被使用或者直接访问,在类的内部方法中使用时self.__private_attrs
知识点2:类的方法
在类的内部,使用def关键字来定义一个方法,与一般的函数定义是不同的,类方法必须包含参数self,且为第一个参数,self代表的是类的实例,self的名字并不是规定死的,也可以使用this等等.
示例2:
class example():
__private=1 # 私有变量
name=12 # 共有变量
def count(self):
self.__private+=1
self.name+=2
print(self.__private)
提示:__private:两个下划线开头,声明该方法为私有方法,只能在类的内部调用,不能在类的外部调用,self.__private
知识点3:单下划线、双下划线、头尾双下划线的说明
-
__foo__:定义的是特殊方法,一般是系统定义名字,类似__init__()之类的
-
_foo:以单下换线开头的表示的是projected类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于from model import * 之中
-
__foo:双下划线的表示的是私有类型的变量,只能是允许这个类本身进行访问了
知识点4:常见类的专有方法
-
__init__:构造函数,在生成对象时调用
-
__del__:析构函数,释放对象时使用
-
__repr__:打印,转换
-
__setitem__:按照索引赋值
-
__getitem__:按照索引获取值
-
__len__:获得长度
-
__cmp__:比较运算
-
__call__:函数调用
-
__add__:加运算
-
__sub__:减运算
类的继承和多态
继承的定义:即一个派生类继承基类的字段和方,继承也允许把一个派生类的对象作为一个基类对象对待,以普通的类为基础建立专门的类对象。
示例:
# 定义一个类
class people():
name=tom
age=0
def __init__(self,n,a):
self.name=n
self.age=a
def speak(self):
print('%s 说:我 %d 岁'%(self.name,self,age))
# 单继承
class student(people):
grade=12
def __init__(self,n,a,g):
# 调用父类的函数
people.__init__(self,n,a)
self.grade=g
# 覆盖父类的方法
def speak(self):
print('%s 说:我 %d 岁,我读 %d 年纪'%(self.name,self.age,self.grade))
s=student('tom',10,3)
s.speak()
[out]:
tom说:我10岁,我读3年纪
多态的定义:对不同类的对象使用同样的操作
python中多态的特点:
-
只关心对象的实例方法是否同名,不关心对象所属的类型
-
对象所属的类之间,继承关系可有可无
-
多态的好处可以增加代码的外部调用灵活度,让代码更叫通用
-
多态是调用方法的技巧,不会影响到类的内部设计
示例:
# 调用同一个函数fly(),传入不同的参数,可以达到不同的功能
class example(object):
def speak(self):
print('hello world')
class example1(object):
def speak(self):
print('hello beijing')
class example2(object):
def speak(self):
print('hello shanghai')
def speak(obj):
obj.fly()
ex1=example()
fly(ex1)
ex2=example1()
fly(ex2)
ex3=example2()
fly(ex3)
[out]:
hello world
hello beijing
hello shanghai
随着大数据的时代的到来,数据变得越来越重要,数据可以帮助我们来看清行业的本质,也可以帮助我们更加快速的了解一个行业,关注公众号——DT学说,走进数据的时代