对象
什么是对象?
在Python中一切皆对象!这句话是贯穿我们整个Python编程的核心思想。在面向对象程序设计中,对象基本上可以看做特性以及由一系列可以存取、操作这些数据的方法组成的集合。使用对象替代全局变量和函数的原因可能有很多,其中对象最重要的优点以下几点:
- 多态
- 封装
- 继承
一、多态
不同类的对象使用同样的操作,也可以说是同类事物的多种形态
怎么去理解同种事物的多种形态?如下面的例子:
1.鸡和猪和狗,三者都是同类的生物,但是却是不同的表现形式
2.在Python的数据类型中也有很多这样的例子如序列的多种形态有字符串、列表、元祖..
那么在程序中怎么去体现:
import abc
class Animal(metaclass=abc.ABCMeta): #同一类事物:生物
@abc.abstractmethod
def talk(self):
pass
class chicken(Animal): #动物的形态之一:人
def talk(self):
print('say hello')
class Dog(Animal): #动物的形态之二:狗
def talk(self):
print('say wangwang')
class Pig(Animal): #动物的形态之三:猪
def talk(self):
print('say aoao')
在上述程序中,定义了三个类(鸡、狗和猪),三个类继承一同一个类(生物),即同为一种类-->生物,所以他们都有共同的属性就是都会talk,在上例中我们采用的继承的方式这里也是需要大家明白:一个抽象类有多个子类,因而多态的概念依赖于继承
二.继承
继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类,本质的意义是可以减少程序的重复代码
- 类
怎么去解释什么是类,可以将它或多或少地视为种类或者类型的同义词。从很多方面方面来说这就是类———— 一种对象。所有的对象都属于一个类,称为类的实例。
下面我们先创建一个类:
class people: #人类
def walk(self):
print("%s is walking"%self.name)
def foo(self):
print("from father %s" %self.name)
上例包含了两个方法定义,现在我们将这个例实例化一个对象:
class people:
def walk(self,name):
self.name=name
print("%s is walking"%self.name)
def foo(self):
print("from father %s" %self.name)
t1=people()
t1.walk("whatmini")
"D:Program Filespython.exe" E:/py_code/FTP项目/server端/调试模块.py
whatmini is walking
Process finished with exit code 0
通过上例结果一目了然,应该能说明self的用处了。在调用t1的walking函数时t1会自动将自己作为第一个参数传入函数中————因此命名为self。对于这个变量,每个人可能都会有自己的叫法,但是因为它总是对象自身,所以习惯叫它self。
同时需要知道的是特性也是可以在外部进行访问的如:
class people:
def walk(self,name):
self.name=name
print("%s is walking"%self.name)
def foo(self):
print("from father %s" %self.name)
t1=people()
t1.walk("whatmini")
print(t1.name)
"D:Program Filespython.exe" E:/py_code/FTP项目/server端/调试模块.py
whatmini is walking
whatmini
Process finished with exit code 0
- 类的特性、函数和方法
self 参数事实上正是方法和函数的区别。方法(专业来讲可以称为绑定方法)将他们第一个参数绑定到所属的实例上,因此你无需显示提供该参数。当然也可以将特性绑定到一个普通函数上,这样就不会有特殊的self参数:
class Class:
def method(self):
print("I have a self")
def func():
print("I don't..")
t1=Class()
t1.method()
t1.method=func
t1.method()
"D:Program Filespython.exe" E:/py_code/FTP项目/server端/调试模块.py
I have a self
I don't..
Process finished with exit code 0
需要注意的是,self参数并不依赖于调用方法的方式,可以随意使用其他变量引用同一个方法:
class Bird:
song="squaawk!"
def sing(self):
print(self.song)
bird=Bird()
bird.sing()
birdsong=bird.sing
birdsong()
"D:Program Filespython.exe" E:/py_code/FTP项目/server端/调试模块.py
squaawk!
squaawk!
Process finished with exit code 0
尽管最后一方法的调用看起来和函数十分相似,但是变量birdsong引用绑定方法bird.sing上,也就意味着这还是会对self参数进行访问(也就是说它仍旧绑定到类的相同实例上)
- 实例化(_ init _)
类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例后的对象定制自己的特性
class people:
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
def walk(self):
print("%s is walking"%self.name)
def foo(self):
print("from father %s" %self.name)
t1=people("whatmini",18,"man")
print(t1.name)
print(t1.age)
print(t1.sex)
"D:Program Filespython.exe" E:/py_code/FTP项目/server端/调试模块.py
whatmini
18
man
Process finished with exit code 0
上例可以知道init的作用就是对实例化的对象进行初始化作用