美文网首页
22.python3面向对象

22.python3面向对象

作者: dwy_interesting | 来源:发表于2020-05-26 10:50 被阅读0次

面向对象术语

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

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

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

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

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

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

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

方法:类中定义的函数。

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

类定义

Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。

对象可以包含任意数量和类型的数据。
举个栗子:

class test(object):   #定义一个类,在3.5中必须指定基类object
    i = 123       #类变量
    def func(self):   #类方法
        print('第一个类')
        return 'hello python'

s = test()     #通过类实例化对象
str = s.func()   #对象调用类方法
print(test.i)   #通过类名调用类变量
print(str)    #类返回值

#output
第一个类
hello python

类有一个名为 init() 的特殊方法(构造方法),该方法在类实例化时会自动调用, init() 方法可以有参数,参数通过 init() 传递到类的实例化操作上。
类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性和方法;实例化类后可以使用其属性,也可以动态的为实例对象添加属性而不影响类对象。可以使用点(.)来访问对象的属性,也可以使用函数的方式来访问属性:
举个栗子:

class A(object):
    def __init__(self,x):
        self.x = x
    def static_func(y=5):
        print(y)

d = A(10)        #类实例化对象
print(getattr(d,'x'))        #getattr访问对象的属性,返回结果:10
print(hasattr(d,'x'))        #hasattr检查对象属性是否存在,返回结果:True
print(setattr(d,'y','zhang'))          #设置对象的属性,如果属性不存在则创建新属性,返回结果:None
print(d.y)         #打印实例对象属性值,返回结果:zhang
delattr(d,'y')          #defattr删除对象属性
print(hasattr(d,'x'))         #返回结果:True

python3类的专有方法:
init 构造函数,在生成对象时调用
del 析构函数,释放对象时使用
repr 打印,转换
setitem按照索引赋值
getitem按照索引获取值
len获得长度
cmp比较运算
call函数调用
add加运算
sub减运算
mul乘运算
div除运算
mod求余运算
pow乘方

举个栗子:

class test1(object):
    a = 3
    b = 2
    def get(self):
        print('取幂:',self.b.__pow__(self.a))
        print('求余数:',self.b.__mod__(self.a))
        print('乘:',self.b.__mul__(self.a))
        print('减:',self.b.__sub__(self.a))
        print('加:',self.b.__add__(self.a))
        print('输出:',self.b.__repr__())

d = test1()
d.get()

输出结果

取幂: 8
求余数: 2
乘: 6
减: -1
加: 5
输出:2
python3类属性、类方法:在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self, 且为第一个参数,self 代表的是类的实例。
举个栗子:

class people:
    #定义基本属性
    name = ''
    age = 0
    #定义构造方法
    def __init__(self,n,a):
        self.name = n
        self.age = a
    def speak(self):
        print("%s 说: 我 %d 岁。" %(self.name,self.age))
 
# 实例化类
p = people('xiaoming',10)
p.speak()

python3静态方法:静态方法是一种普通函数,就位于类定义的命名空间中,使用装饰器@staticmethod定义静态方法。类对象和实例都可以调用静态方法,静态方法不能调用类属性和实例属性,但可以调用传参。

举个栗子:

class A(object):
    number = 10
    def __init__(self,name):
        self.name = name
    def car(self):
        print(self.name)
    @staticmethod   #定义静态方法
    def cat(x,y):    #定义调用传参
        print('静态方法:%s'%(x*y))

d = A('hello')   #实例化类
d.car()   #实例方法,返回结果:hello
d.cat(5,4)   #实例调用静态方法,返回结果:静态方法:20
A.cat(6,3)   #类调用静态方法,返回结果:静态方法:18

类的封装

封装,也就是把客观事物封装成抽象的类,并且类可以使得自己的数据和方法,只让可信的类或者对象操作,对不可信的进行信息隐藏。python通过变量名命名来区分属性和方法的访问权限。
类的私有属性: __private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时self.__private_attrs。
类的私有方法:__private_method:两个下划线开头,声明该方法为私有方法,不能在类外部调用。在类的内部调用 self.__private_methods
举个栗子:

class father(object):
    __name = '私有属性'
    age = "公有属性"
    def func(self):
        print(self.age)
        print(self.__name)
    def __foo(self):   #定义私有方法
        print(self.__name)
class son(father):
    def show(self):
    print(father.age)              #返回结果:公有属性

obj1 = father()
obj1.func()              #返回结果:公有属性   私有属性
#obj1.__foo()              #直接调用会报错,只有通过"_类名__方法"的形式调用
obj1._father__foo()              #调用私有方法,返回结果:私有属性
print(obj1.age)               #返回结果:公有属性
#print(obj1.__name)               #直接调用会报错,通过“_类名__属性”方法调用
print(obj1._fater__name)              #调用私有属性,返回结果:私有属性

obj2 = son()
obj2.show()               #调用父类属性,返回结果:公有属性
obj2.func()               #返回结果:公有属性
obj2.__foo()              #调用父类方法错误
obj2._father__foo()              #正确调用父类方法,返回结果:私有属性

继承

继承是面向对象的重要特征之一,继承是两个类或者多个类之间的父子关系,子类可继承父类的所有公有实例变量和方法。继承实现了代码的重用,减少代码的重新编写。
python在类名后用一对圆括号表示继承关系,括号中的类表示父类或基类

经典类和新式类:

#经典类和新式类的区别:当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类。

class old:   #经典类写法
    pass

class new(object):  #新式类写法
    pass

在python中类继承的特点:

1:在继承中,基类的构造(init())方法不会被自动调用,它需要在其派生类的构造中专门调用。使用super().init()或parentClassName.init()

2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数

3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。

如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。
举个栗子:

class test(object):   #定义父类
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def buygo(self):
        print('%s[%s]岁' %(self.name,self.age))

class test_student(test):   #调用父类
    def __init__(self,name,age,good):  
        test.__init__(self,name,age)  #重写父类构造方法
        self.good = good
    def buygo(self):   #如果父类中的方法名相同于子类中的方法名,子类方法将覆盖父类方法。
        print('%s[%s]岁,很%s' %(self.name,self.age,self.good))

#通过类实例化对象
zhangsan = test_student('zhangsan','厉害')
lisi = test_student('lisi',22,'能长个子吧')

zhangsan.buygo()      #返回结果:zhangsan[20]岁,很厉害
lisi.buygo()      #返回结果:lisi[22]岁,很能长个子吧

多态

多态依赖于继承,多态的作用,就是为了类在继承和派生的时候,保证继承类中实例的某个属性或方法的调用,实现接口的重用。
举个栗子:

class A(object):
    def __init__(self):
        self.name = 'ZHANGSAN'

    def show(self):
        print('A.show:',self.name)

class B(A):
    def show(self):
        print('show_b:',self.name)

class C(A):
    def show(self):
        print('show_c:',self.name)

def func(obj):   #定义函数,传递对象
    obj.show()   #通过类实例对象调用类下的方法

A_obj = A()
B_obj = B()
C_obj = C()

func(A_obj)
func(B_obj)
func(C_obj)

运行结果:
A.show: ZHANGSAN
show_b: ZHANGSAN
show_c: ZHANGSAN

相关文章

  • 22.python3面向对象

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

  • PHP全栈学习笔记8

    面向对象的基本概念,面向对象编程,oop,面向对象,面向对象的分析,面向对象的设计,面向对象的编程,什么是类。 类...

  • PHP全栈学习笔记8

    面向对象的基本概念,面向对象编程,oop,面向对象,面向对象的分析,面向对象的设计,面向对象的编程,什么是类。 类...

  • 总结.Net基础知识——献给即将入坑的同行们(一期)

    什么是面向对象 面向对象OO = 面向对象的分析OOA + 面向对象的设计OOD + 面向对象的编程OOP; 通俗...

  • 面向对象基础

    面向对象编程包括: 面向对象的分析(OOA) 面向对象的设计(OOD) 面向对象的编程实现(OOP) 面向对象思想...

  • 20-OOP类与对象

    面向对象 Object Oriented 学习面向对象:XXOO 面向对象的学习: 面向过程和面向对象的区别: 面...

  • JavaScript面向对象核心知识归纳

    面向对象 概念 面向对象就是使用对象。面向对象开发就是使用对象开发。 面向过程就是用过程的方式进行开发。面向对象是...

  • 面向对象(未完成)

    面向对象 标签(空格分隔): 面向对象 第一章:面向对象(上) 什么叫面向对象 面向过程、面向对象、两者区别 构造...

  • 面向对象:创建对象&继承

    博客内容:什么是面向对象为什么要面向对象面向对象编程的特性和原则理解对象属性创建对象继承 什么是面向对象 面向对象...

  • 面向对象

    了解什么是面向对象 首先,我们学习面向对象,要了解什么是面向对象,面向对象的重要概念:类,对象。 面向对象提出的这...

网友评论

      本文标题:22.python3面向对象

      本文链接:https://www.haomeiwen.com/subject/izjkwhtx.html