python面向对象基础

python面向对象基础

        • 面向对象与面向过程的区别(举例说明)
        • 对象
        • 面向对象程序设计的三大特点
            • 封装
            • 继承
            • 多态
        • 类的定义和使用
          • 定义类
          • 创建类
            • 类属性
            • 类方法
            • 静态方法
        • 创建对象
        • 动态绑定属性和方法
        • 方法重写
        • 特殊属性与方法

面向对象与面向过程的区别(举例说明)

面向过程:吃饭的时候,必须严格按照步骤,第一步生火,第二步洗菜,第三步放油,第四步放菜,第五步炒菜,第六步端菜

面向对象:只需要点外卖打个电话,不需要知晓菜是谁买的,饭是谁做的,外卖是是谁送的,只要拿到饭了就可以

对象

对象是一个抽象的概念,表示任意存在的事物。通常将对象划分为两个部分,静态部分称为属性,动态部分称为行为。

类是多个类似事物组成的群体的统称,是封装对象的属性和行为的载体,反过来说,具有相同属性和行为的一类实体被称为类。

类是对象的抽象,对象是类的实体(实例)。

面向对象程序设计的三大特点

封装

将对象的属性和行为封装起来,而将这些封装起来的载体就是类。

  • 将属性和行为包装到类对象中。在方法内部对属性进行操作,在类对象的外部调用方法。这样无须关心方法内部的具体实现细节,隔离了复杂度。
  • 如果该属性不希望被类对象外部所访问,可在前面加两个_(类似于C++私有变量),但如果想访问可使用以下语法
_类名__属性
继承

子类通过继承复用了父类的属性和行为的同时,又增加了子类特有的属性和行为,提高了代码的复用性。

  • 如果一个类没有继承任何类,则默认继承object
  • 定义子类时,必须在其构造函数中调用父类的构造函数
class A(object):
    pass
class B(A):
    pass
多态

一个父类衍生出不同的子类,子类继承父类特征的同时,也具备了自己的特征,并且能够实现不同的效果,这就是多态化的结构,提高了代码的可扩展性和可维护性。

class Animal(object):
    def eat(self):
        print('动物会吃')

class Dog(Animal):
    def eat(self):
        print('狗吃骨头')
        
class Cat(Animal):
    def eat(self):
        print('猫吃鱼')

def fun(obj):
    obj.eat()

fun(Animal())  #因为Animal是类对象,Animal()为实例对象

类的定义和使用

定义类

在python中,类的定义使用class关键字来实现,语法如下:

class ClassName:
    '''类的帮助信息''' #类的帮助信息(即注释)
    statement         #类体(由类变量、方法和属性等定义语句组成)

ClassName:用于指定类名,一般使用大写字母开头,如果类中包含两个单词,第二个单词的首字母也大写。

创建类
class Student:
    grade = 'four'       #类属性,直接写在类中的变量叫类属性
    #初始化方法
    def __init__(self,name,age):  #name与age是实例属性
        self.name = name  #self.name是实例属性,这里进行了赋值操作,属性名与变量名可以不相同
        self.age = age
    #实例方法
    def info(self):
         print('我的名字是'+self.name+' 年龄是'+self.age)
    #类方法
    @classmethod
    def cm(cls):       #类方法中写cls
        print('类方法')
    #静态方法
    @staticmethod
    def sm():          #在静态方法中不允许写self
        print('静态方法')

在类之外定义的称为函数,在类之内定义的称为方法

实例方法用来修改实例属性,类方法用来修改类属性

类属性

类中方法外的属性称为类属性,被该类所有的对象所共享

#调用语法
print(Student.grade)
print(stu1.grade)

当Student.grade改变时,stu1.grade也改变

类方法

使用@classmethod修饰的方法,使用类名直接访问的方法

#调用语法
Student.cm()
静态方法

使用@staticmethod修饰的方法,使用类名直接访问的方法

#调用语法
Student.sm()

创建对象

stu1 = Student('张三',20)

在实例对象stu1中,会有一个类指针指向类对象Student,此时stu1就可以调用类中的方法和属性

stu1.info()#调用实例方法
print(stu1.name)#调用初始化方法
Student.info(stu1)#调用实例方法的另一种形式

动态绑定属性和方法

比如上面的stu1张三同学想要再添加一个性别属性,直接在类外进行赋值即可动态绑定

stu1.gender = '女'

如果想要添加动态方法,则在类外定义一个函数,并将此函数赋给对象的方法

def show():
    print('动态绑定方法')
stu1.show = show
#调用
stu1.show()

方法重写

  • 如果子类对继承自父类的某个属性或方法不满意,可以在子类中对其(方法体)进行编写
  • 子类重写后的方法可以中可以通过super().xxx()调用父类中被重写的方法
  • 重写是多态的一种表现形式
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def info(self):
        print('姓名:{0},年龄:{1}'.format(self.name, self.age))


# 定义子类
class Student(Person):
    def __init__(self, name, age, score):
        super().__init__(name, age)  # 重写
        self.score = score

    def info(self):
        super().info() #继承
        print('成绩{0}'.format(self.score))#重写


p = Person('sun', 2)
p.info()
r = Student('jie', 3, 45)
r.info()

特殊属性与方法

python面向对象基础_第1张图片

class Student:
    def __init__(self, name):
        self.name = name

    def __add__(self, other):
        return self.name+other.name
    
    def __len__(self):#重写此方法用来查看类中某属性的长度
        return len(self.name)

stu1 = Student('张三')
stu2 = Student('李四')
stu3 = Student('Jack')

s = stu1+stu2#因为Student类中的add方法使stu1与stu2具有加的功能
print(s)
r = stu1.__add__(stu2)#调用对象方法
print(r)
m = stu3.__len__()
print(m)

__new__方法是创建对象,并要返回一个实例对象,__init__方法则是初始化这个对象

你可能感兴趣的:(python)