Python面向对象

类:

  用来描述具有相同的属性和方法的对象的集合,类也是一种对象;

对象:

  对象有属性和方法,属性就是对象中的变量,方法就是存放在属性中的函数,与函数区别在于方法有一个self参数,这个参数是关联到它自身所属的instance上,函数是一个可以执行操作返回值的程序段。

  对象是类的实例。

面向对象三大特性

封装:

封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。

把代码封装起来,不知怎么实现的过程,但调用即可实现;

  • 将内容封装到某处
  • 从某处调用被封装的内容

继承:

1、Python的类可以继承多个类,Java和C#中则只能继承一个类

2、Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先广度优先

  • 当类是经典类时,多继承情况下,会按照深度优先方式查找
  • 当类是新式类时,多继承情况下,会按照广度优先方式查找
class D:

    def bar(self):
        print 'D.bar'


class C(D):

    def bar(self):
        print 'C.bar'


class B(D):

    def bar(self):
        print 'B.bar'


class A(B, C):

    def bar(self):
        print 'A.bar'

a = A()
# 执行bar方法时
# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> D --> C
# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
a.bar()
经典类多继承
class D(object):

    def bar(self):
        print 'D.bar'


class C(D):

    def bar(self):
        print 'C.bar'


class B(D):

    def bar(self):
        print 'B.bar'


class A(B, C):

    def bar(self):
        print 'A.bar'

a = A()
# 执行bar方法时
# 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
# 所以,查找顺序:A --> B --> C --> D
# 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
a.bar()
新式类多继承

注意:在上述查找过程中,一旦找到,则寻找过程立即中断,便不会再继续找了

多态:

Pyhon不支持Java和C#这一类强类型语言中多态的写法,但是原生多态,其Python崇尚“鸭子类型”。

class F1:
    pass


class S1(F1):

    def show(self):
        print 'S1.show'


class S2(F1):

    def show(self):
        print 'S2.show'

def Func(obj):
    print obj.show()

s1_obj = S1()
Func(s1_obj) 

s2_obj = S2()
Func(s2_obj) 
Python “鸭子类型”

类成员 

字段

字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同,

  • 普通字段属于对象
  • 静态字段属于
class Province:

    # 静态字段
    country = '中国'

    def __init__(self, name):

        # 普通字段
        self.name = name


# 直接访问普通字段
obj = Province('河北省')
print obj.name

# 直接访问静态字段
Province.country
字段的定义和使用
  • 静态字段在内存中只保存一份
  • 普通字段在每个对象中都要保存一份

应用场景: 通过类创建对象时,如果每个对象都具有相同的字段,那么就使用静态字段

方法

方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。

  • 实例方法:就是普通的对象方法,只能通过对象实例来调用,调用时参数self会自动关联到对象实例。
  • 类方法:需要指定修饰器@classmethod,类方法可以通过类直接调用,也可以通过对象直接调用,但参数cls将自动关联到类。
  • 静态方法:需要指定修饰器@staticmethod,没有参数self,可以直接通过类来调用;是个独立的函数,仅仅是存在于类的名称空间中,便于使用和维护。

相同点:对于所有的方法而言,均属于类(非对象)中,所以,在内存中也只保存一份。

不同点:方法调用者不同、调用方法时自动传入的参数不同。

#!/usr/bin/env python3.6
#-*- coding:utf-8 -*-
#
class Person(object):
    city = 'Beijing'
 
    def __init__(self,name):
        self.name = name
        self.age =28
 
    # 实例方法
    def showInfo(self):
        info = "name: %s, age: %s" % (self.name, self.age)
        print(info)
 
    # 类方法
    @classmethod
    def sayHi(cls):
        print('hi, i am in %s' % cls.city)
 
    # 静态方法
    @staticmethod
    def sayBye():
        print('byebye')
方法

属性

python中的属性其实是普通方法的衍生。

属性的定义有两种方式:

  • 装饰器 即:在方法上应用装饰器
  • 静态字段 即:在类中定义值为property对象的静态字段

装饰器方式:在类的普通方法上应用@property装饰器

# ############### 定义 ###############    
class Goods:

    @property
    def price(self):
        return "wupeiqi"
# ############### 调用 ###############
obj = Goods()
result = obj.price  # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
经典类
# ############### 定义 ###############
class Goods(object):

    @property
    def price(self):
        print '@property'

    @price.setter
    def price(self, value):
        print '@price.setter'

    @price.deleter
    def price(self):
        print '@price.deleter'

# ############### 调用 ###############
obj = Goods()

obj.price          # 自动执行 @property 修饰的 price 方法,并获取方法的返回值

obj.price = 123    # 自动执行 @price.setter 修饰的 price 方法,并将  123 赋值给方法的参数

del obj.price      # 自动执行 @price.deleter 修饰的 price 方法
新式类

静态字段方式,创建值为property对象的静态字段

当使用静态字段的方式创建属性时,经典类和新式类无区别

class Foo:

    def get_bar(self):
        return 'wupeiqi'

    # *必须两个参数
    def set_bar(self, value): 
        return return 'set value' + value

    def del_bar(self):
        return 'wupeiqi'

    BAR = property(get_bar, set_bar, del_bar, 'description...')

obj = Foo()

obj.BAR              # 自动调用第一个参数中定义的方法:get_bar
obj.BAR = "alex"     # 自动调用第二个参数中定义的方法:set_bar方法,并将“alex”当作参数传入
del Foo.BAR          # 自动调用第三个参数中定义的方法:del_bar方法
obj.BAE.__doc__      # 自动获取第四个参数中设置的值:description...
静态字段

类的特殊成员

上文介绍了Python的类成员以及成员修饰符,从而了解到类中有字段、方法和属性三大类成员,并且成员名前如果有两个下划线,则表示该成员是私有成员,私有成员只能由类内部调用。无论人或事物往往都有不按套路出牌的情况,Python的类成员也是如此,存在着一些具有特殊含义的成员,详情如下:

__doc__:返回类的注释string;
__module__:表示当前操作的对象在那个模块;
__class__:表示当前操作的对象的类是什么;
__new__:创建类的方法,之后才会执行__init__方法;
__init__:构造方法,通过类创建对象时,自动触发执行;
__call__:将实例对象被当作函数调用时,如果定义了这个方法,则调用此方法;
__del__:析构方法,当对象在内存中被释放时,自动触发执行;
__dict__:将对象中封装的所有实例共享的变量和函数通过字典的形式返回;
__str__:print打印对象时,返回该方法的返回值;
__getitem____setitem____delitem__:可以使对象进行切片(slice对象)和索引;
__iter__(self), 类中有__iter__方法就认为是可迭代对象,此方法返回一个迭代器对象;
__repr__在python解释器命令行环境下,会默认显示对象的repr表示。

type类的构造函数

def func(self):
    print 'hello wupeiqi'
 
Foo = type('Foo',(object,), {'func': func})
#type第一个参数:类名
#type第二个参数:当前类的基类
#type第三个参数:类的成员

 

posted @ 2019-09-11 14:29  houyongchong  阅读(122)  评论(0编辑  收藏  举报