python -面向对象

前言:
计算机编程中最常被提到的就是类和对象,掌握类和对象,有助于使用Python编程语言快速实现复杂的项目。

先简单了解面向对象的基本特征:
对象: 对象可以是有形的,也可以是无形的。人们在认识世界时,会将对象简单处理为两个部分——属性和行为。通过类定义的数据结构实例,对象包括两个数据成员(类变量和实例变量)和方法。
类(Class): 是对象的属性和行为被进一步封装的模板。它是用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
类变量: 类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
数据成员: 类变量或者实例变量, 用于处理类及其实例对象的相关的数据。
方法重写: 如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
实例变量: 在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
继承: 即一个派生类(Derived class)继承基类(Base Class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
实例化: 创建一个类的实例,一个类的具体对象。
方法: 类中定义的函数。

python与面向对象:
Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。下面详细介绍Python的面向对象编程。
定义类的语法:
类必须在被定义后才能使用,定义一个类也就是定义这一类对象的模板,定义它的属性所法。Python中提供了class关键字来声明一个类,class中有成员属性和成员方法。Python中类的就格式如下:

class EmptyClass: //[类名],类名需要区分大小写
    pass  //[语法块]

类的使用:
在使用类之前需要实例化类,类实例化后会成为常见对象。创建对象和创建变量类似,需要先声明对象是哪个类,同时指明变量名称。

类的构造方法:
在创建实例时,很多类可能都需要有特定的初始状态。所以,一个类可以定义一个特殊的方法,叫作构造函数。在Python中,构造函数就是类的 _init_方法(init前后都有两个连续的短下划线)。
下面展示一些 内联代码片

class Dog:
    def_init_ (self):
    printf("www!")
    
dog=Dog()

执行结果如下:

www!

当一个类定义了_init_方法,类在实例化时会自动调用_init_方法,用于创建新的类实例。在这个例子中,新的实例被创建,同时执行了构造方法,运行了print函数。注意:构造函数的第一个参数是“self”,不能漏掉。

类的属性:
在构造方法中我们可以初始化一些属性,属性(成员变量、类变量)必须要使用“self”加上点的方式赋值,不能直接定义变量。

self.name = name
self.age = 3

类中的方法:
在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数。类方法可以读取和修改类变量。

def__init__(self,name):
   self.name = name

注意:self代表类的实例,而非类。
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。self 不是 python 关键字,我们把他换成 runoob 也是可以正常执行的:

class Test:
    def prt(runoob):
        print(runoob)
        print(runoob.__class__)
 
t = Test()
t.prt()

类的私有属性:
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。

def__init__(self,name):
   self.__name = name

类的私有方法:
__private_method:两个下划线开头,声明该方法为私有方法,不能在类的外部调用。在类的内部调用 self.__private_methods。

def__say(self,name):
   print(name)
def play(self):
   self.__say(www!)

类的继承:
通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类。如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。

子类的声明,与父类类似。定义子类的语法如下:

class 派生类名(基类名)
    ...
class SubClass(BaceClass1,BaceClass2):
语法块

注意:子类不能继承父类中的私有方法,也不能调用父类的私有方法。

继承实例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
class Parent:        # 定义父类
   parentAttr = 100
   def __init__(self):
      print "调用父类构造函数"
 
   def parentMethod(self):
      print '调用父类方法'
 
   def setAttr(self, attr):
      Parent.parentAttr = attr
 
   def getAttr(self):
      print "父类属性 :", Parent.parentAttr
 
class Child(Parent): # 定义子类
   def __init__(self):
      print "调用子类构造方法"
 
   def childMethod(self):
      print '调用子类方法'
 
c = Child()          # 实例化子类
c.childMethod()      # 调用子类的方法
c.parentMethod()     # 调用父类方法
c.setAttr(200)       # 再次调用父类的方法 - 设置属性值
c.getAttr()          # 再次调用父类的方法 - 获取属性值

类变量:
类变量不需要实例化就能直接使用,相当于绑定在类,而不是绑定在实例上。

class Animal:
    name=“动物”
print(Animal.name)