Python3 面对对象基础

面对对象程序设计(Object Oriented Programming,OOP)主要针对大型软件设计而提出,使软件设计更加灵活,能够更好地支持代码复用和设计复用,并且使代码具有更好的可读性和可扩展性。
面对对象程序设计的关键性观念是,将数据以及对数据的操作封装在一起,组成一个不可分割的整体,即对象。对于相同类型的对象进行分类,抽象后,得出共同的特征而形成类,面对对象程序设计的关键是如何合理的定义和组织这些类与类之间的关系。

1.类与对象的定义

在面对对象编程中类是对某一类事物的描述,是抽象的,概念上的意义。类是对一群具有相同属性和方法的对象的抽象。**对象是类的实例**,是通过类定义的数据结构产生的实例。

1.定义类

class Animal(object):
#类属性
	name='cat'
	def info(self):
		print("This is a cat.")

此例中Animal为类名,object为所有类的父类,表示Animal类继承object类。
定义类后,可以实例化对象,并通过对象访问类中的属性和方法。

#实例化类
animal=Animal()
print("Animal类对象的属性name为:",animal.name)
#输出结果为:
Animal类对象的属性name为: cat

在类中直接定义的属性也成为类属性,类属性属于类本身,可通过类名或对象进行访问和修改。

Animal.name='dog'
print("Animal类实例属性name为:",Animal.name)
#输出结果为:
Animal类实例属性name为: dog

在定义类的方法时,第一个参数必须是self,self参数代表将来要创建的对象本身,需要使用类的对象来调用类中定义的方法。在调用方法时,通过实例名直接调用,除了第一个参数self不用传递,其他参数正常传参。

animal.info()
#输出结果为:
This is a cat.

2.构造方法
Python中类的构造方法是__init__(),一般用来为类的属性设置初值或进行其他必要的初始化工作。在创建对象时被自动调用和执行。如果用户没有设计构造函数,Python将提供一个默认的构造函数来进行必要的初始化工作。init()方法的第一个参数仍是self,表示创建的实例本身。
在初始化类时,可通过self属性的方法对类属性进行赋值,在__init__()方法中定义的属性是实例属性,用于记录该对象的特殊信息。在类的方法中通过self属性的方法获得属性值。

class Animal(object):
    name='cat'
    def __init__(self,age,gender):
        #实例属性
        self.age=age
        self.gender=gender

    def state(self):
        print('{0}的年龄是{1}'.format(self.name,self.age))

面对对象编程的一个重要特点是数据封装,在Animal类中初始化的实例属性age和gender,可以在类的方法中通过类的对象访问类的实例属性。

animal=Animal(5,'male')
animal.state()
#输出结果为:
cat的年龄是5

类的实例属性可被类的对象访问并修改。

animal.age=10
animal.name='dog'
animal.state()
#输出结果为:
dog的年龄是10

2.私有属性和方法

类的属性既可以在类的内部进行访问和修改,也可以通过类的对象进行访问和修改,这样会破环数据封装。 Python中定义类的属性时,**如果属性的名称以两个下划线“__”开头则表示为私有属性**。私有属性在类的外部不能直接访问,需要通过调用对象的公有方法来访问。子类可以继承父类的公有成员,但是不能继承其私有成员。
class Animal(object):
    name='cat'
    def __init__(self,age,gender):
        #实例属性
        self.__age=age
        self.gender=gender

    def state(self):
        print('{0}的年龄是{1}'.format(self.name,self.__age))

    def info(self):
        print("This is a "+self.name)

上例中将age改为私有属性,通过state()方法可访问,但若使用对象直接访问私有属性则会报错。

print(animal.__age)
#结果为:
AttributeError: 'Animal' object has no attribute '__age'

在类中还可以定义私有方法,私有方法的名称以两个下划线"__"开始,在私有方法中可以访问类的所有属性,只能在类的内部调用私有方法,无法通过对象调用私有方法。

3.继承

设计一个新类时,如果可以继承一个已有的设计良好的类并进行二次开发,无疑会大幅减少开发的工作量。在继承关系中,已有的,设计好的类称为父类或基类,新设计的类为子类或派生类。子类可以通过继承父类,享有父类的所有属性和方法。在Python中同时支持类的单继承和多继承。

1.单继承
语法如下:

class SubClassName(ParentClassName1):
	pass

子类SubClassName通过继承ParentClassName获得父类的所有属性和方法。 在python中当子类继承父类时,在子类的构造函数中调用父类的构造函数有两种写法。
(1)经典类的写法:父类.init(self,param1,param2,…)
(2)新式类的写法:super(子类,self).init(param1,param2…)

class Animal(object):
    def __init__(self,name,age):
        #实例属性
        self.name=name
        self.age=age

    def jump(self):
        print('{0} can jump.'.format(self.name))

    def info(self):
        print("This is a "+self.name)

class Cat(Animal):
    def __init__(self,name,age,gender):
        # 调用父类的构造方法,也可写成 Animal.__init__(self,name,age)
        super(Cat,self).__init__(name,age)
        # 定义类的本身属性
        self.gender=gender

    def info(self):
        print("This is a {0}. It's age is {1}.".format(self.name,self.age))


cat=Cat('cat',5,'male')
cat.jump()
cat.info()

#输出结果为:
cat can jump.
This is a cat. It's age is 5.

上例中Cat类继承Animal类。
继承的好处是子类获得了父类的全部属性和方法,还可以在子类中封装自己的方法,提高代码的复用性。父类中和子类中都有方法info(),则最后调用的是子类中的方法。
2.子类对父类方法的重写
Python中如需在子类调用父类原有的方法,可以通过super()方法名()的方式进行调用。

#在cat类中的一个方法里写入下式,即可调用Animal类中的info方法
super().info()

3.多继承
Python中不仅支持单继承,还支持多继承。Python中类的多继承的语法如下。

class SubClassName(ParentClassName1,ParentClassName2,...)
	pass

Python支持多继承,如果父类中有相同的方法名,而在子类中使用时没有指定父类名,则Python解释器将从左向右按顺序进行搜索,即方法在子类中无法找到时,从左往右查找父类中是否包含方法。

4.静态方法和特殊方法

静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,不会涉及到类中的方法和属性的操作。静态方法定义时使用@staticmethod装饰器。 静态方法可以通过类名访问,也可以通过实例访问。
class Dog():
    @staticmethod
    def info():
        print('This is a dog.')

dog=Dog()
#通过实例调用静态方法
dog.info()
#通过类名调用静态方法
Dog.info()

特殊方法总是被双下划线包围,如__init__,特殊属性也是以双下划线包围的属性,如__dict__和__slots__【了解】
__name__获取类名的字符串,通过类名访问,对象访问会报错。
__dict__通过对象访问:获取的是该对象的属性和方法,返回一个字典;通过类名访问:获取的是该类的所有的信息。
__slots__可将实例属性锁定到__slots__规定的范围内。

class Animal(object):
    __slots__ = ('name','age')
    def __init__(self,name,age):
        #实例属性
        self.name=name
        self.age=age

animal=Animal(5,'male')
animal.gender='male'

#输出结果为:
AttributeError: 'Animal' object has no attribute 'gender'

5.可调用对象

任何一个有__call__()特殊方法的对象都被当做是函数,示例如下。

class Add(object):
    def __call__(self,x,y):
        return x+y
    
add=Add()
print(add(2,4))

#输出结果为:
6	

一个类实例也可变成一个可调用对象,只需实现一个特殊方法__call__()。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值