python面向对象编程基础

一、概念

类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。

数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。

方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

实例变量:定义在方法中的变量,只作用于当前实例的类。

继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个 Dog 类型的对象派生自 Animal 类,这是模拟"是一个(is-a)"关系(例图,Dog 是一个 Animal)。

实例化:创建一个类的实例,类的具体对象。

方法:类中定义的函数。

对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

二、创建类和实例对象

# -*- coding: utf-8 -*-
"""
Created on Sat Mar 24 11:15:58 2018

@author: smile__su
"""
'''
class Employee:   #创建类
    empCount=0
    def __init__(self,name,salary):
        self.name=name
        self.salary=salary
        Employee.empCount+=1
        
    def displayCount(self):
        print('Total Employee:',Employee.empCount)
        
        
    def displayEmployee(self):
        print('Name:',self.name,'Salary:',self.salary)
        
emp1=Employee('Zara','2000')    #创建第一个实例对象
emp2=Employee('Zaras','3000')   #创建第二个实例对象
emp3=Employee('Zaras','3000')   #创建第三个实例对象
emp4=Employee('Zarad','4000')   #创建第四个实例对象

emp4.displayEmployee()         #使用.访问对象属性
Employee.displayCount(emp4)
print(emp1.name,emp1.salary)
print(Employee.empCount)

getattr(emp3,'name')    # 返回 'age' 属性的值 
hasattr(emp1,'age')     # 如果存在 'age' 属性返回 True
setattr(emp1,'age',5)   # 添加属性 'age' 值为 5
delattr(emp1,'age')     # 删除属性 'age' 

运行结果:


三、python内置类属性
__dict__   : 类的属性(包含一个字典,由类的数据属性组成)
__doc__ :类的文档字符串
__name__: 类名
__module__ : 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块 mymod 中,那么 className.__module__ 等于 mymod)
__bases__: :类的所有父类构成元素(包含了一个由所有父类组成的元组)

四、python对象销毁(垃圾回收)

class Point:
    def __init__(self,x=0,y=0):
        self.x=x
        self.y=y
        
    def __del__(self):
        class_name=self.__class__.__name__
        print('实例{}被销毁,所属类是{}'.format(self,class_name))
        
pt1=Point()

pt3=pt2=pt1
print(id(pt1),id(pt2),id(pt3))

del pt1
del pt2
del pt3

运行结果:



五、类的继承

# -*- coding: utf-8 -*-
"""
Created on Sat Mar 24 14:38:49 2018

@author: smlie__su
"""

'''

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("调用子类方法 child method ")
        
c=Child()  #实例化子类
c.childMethod()   #调用子类方法
c.parentMethod()   #调用父类方法
c.setAttr(200)    #再次调用父类方法
c.getAttr()    #再次调用父类方法

print(issubclass(Child,Parent))  #布尔函数判断一个类是另一个类的
print(isinstance(c,Parent))      #布尔函数如果c是Parent类的实例对象或者是一个Parent子类的实例对象则返回 true

运行结果:


六、方法重写

###方法重写

class Parent:
    def myMethod(self):
            print('调用父类方法')

class Child(Parent):
    def myMethod(self):
        print("调用子类方法")
        
c=Child()  #子类实例
c.myMethod()  #子类调用重写

运行结果:


基础方法重写:


七、类属性与方法

类的私有属性__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
类的方法在类地内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数。
类的私有方法__private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用self.private_metho。
八、单下划线、双下划线、头尾上下划线说明

__foo__: 定义的是内置方法,类似 __init__() 之类的。

_foo: 以单下划线开头的表示的是 protected 类型的变量即保护类型只能允许其本身与子类进行访问,不能用于 from module import *

__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。

猜你喜欢

转载自blog.csdn.net/nageaixiaodenanhai/article/details/79690961
今日推荐