【Python】python进阶篇之面向对象编程

面向对象编程

封装、继承、多态

  • 封装:提高程序安全性

    • 将数据(属性)和行为(方法)包装到类中。在方法内部对属性进行操作,在类的外部调用方法。无需关心方法内部的具体实现细节,从而隔离代码复杂度
    • 在Python中没有专门的修饰符用于属性的私有,如果该属性不希望在类对象外部被访问,属性定义增加两个"_"
  • 继承:提高代码的复用性

  • 多态:提高程序的可扩展性和可维护性

类的定义

class Student:
    #暂时不知道写什么,可以写pass
    pass
类名规范

首字母大写

类的组成

class Student:
    name = '李白'  # 类属性
    age = 18

    # 对象初始化,初始化方法。 方法可以重载吗
    def __init__(self, age):
        self.age = age  # 属性初始化

    # 实例方法。类中叫方法,类之外叫函数
    def eat(self):
        print("学生吃饭。。")

    # 静态方法,静态方法不能写self
    @staticmethod
    def study():
        print("学生学习")

    @classmethod
    def cm(cls):
        print("这是类方法")

    pass


print(id(Student))
print(type(Student))  # <class 'type'>
print(Student)  # <class '__main__.Student'>
类属性
静态方法
实例方法
类方法
初始化方法

对象的创建

实例名=类()

创建对象,执行init方法

stu = Student(18)
print(stu)

#方法和属性的调用
stu.eat()
Student.eat(stu)
stu.study()
stu.cm()
print(stu.name, stu.age)

动态绑定属性和方法

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

    def eat(self):
        print(self.name, "在吃饭")

    pass


stu1 = Student("李白", 19)
stu2 = Student("杜甫", 20)

# 绑定属性
stu1.gender = "男"
print(id(stu1), stu1.name, stu1.age, stu1.gender)
stu1.eat()
# AttributeError: 'Student' object has no attribute 'gender'
# print(id(stu2), stu2.name, stu2.age, stu2.gender)
print(id(stu2), stu2.name, stu2.age)
stu2.eat()


def show():
    print("定义在类之外的函数")
    pass


# 绑定方法
stu1.show = show
stu1.show()

类的封装

class Student:
    def __init__(self, name, age):
        # __属性名 :私有属性 不能直接对象.属性,进行访问,需要提供对外的方法
        self.__name = name
        self.__age = age

    def show(self):
        print(self.__name, self.__age)

    def get_name(self):
        return self.__name

    def set_name(self, name):
        self.__name = name


stu1 = Student("李白", 19)
stu2 = Student("杜甫", 20)
stu1.show()  # 李白 19
stu2.show()  # 杜甫 20
# AttributeError: 'Student' object has no attribute 'name'
# print(stu1.name)
print(stu1.get_name())  # 李白
stu1.set_name("李白2")
print(stu1.get_name())  # 李白2

print(dir(stu1))
print(stu1._Student__name)  # 李白2

python有没有类似java的,访问修饰符?

没有。

属性有私有属性,方法有吗?

有,私有属性、私有方法,都使用两个"_",例:__name

def __test(self):

​ pass

类的继承及方法重写

python可以多继承

基本语法

class 类名(父类1,父类2,父类3…):

​ pass

# Python中的类默认继承object。可不写
class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def info(self):
        print(self.name, self.age)

    pass


class Student(Person):
    def __init__(self, name, age, stu_no):
        super().__init__(name, age)
        self.stu_no = stu_no

    def info(self):
        super().info()  # 调用父类方法
        print(self.stu_no, self.name, "是一个学生")


class Teacher(Person):
    def __init__(self, name, age, thr_no):
        super().__init__(name, age)
        self.thr_no = thr_no

    def info(self):
        # 重写父类的方法
        print(self.thr_no, self.name, "是一个老师")


# 多继承
class StuTeacher(Student, Teacher):
    pass

stu = Student("小明", 18, 12318)
teacher = Teacher("李阳", 58, 12318)
stu.info()
teacher.info()

#多继承,多个父类中有相同方法,属性怎么办
super()

object类

object是所有类的父类

dir函数
class Student:
    def __init__(self):
        pass

    def __str__(self):
        return "重写对象的str方法,类似java对象中的toString方法"

    pass


stu = Student()
print(stu)  # <__main__.Student object at 0x00000131FDA30E08>
# 重写str方法

# 对象的描述函数
print(dir(stu))
for item in dir(stu):
    print(item)

在这里插入图片描述

重写__str__方法

类似java中的重写toString()方法

多态

python方法的形参,没有明确数据类型,python有多态吗?

静态语言与动态语言多态区别

java是静态语言

python是动态语言

特殊属性

特殊方法

在这里插入图片描述

_new_()与_init_()

new函数在init函数之前执行,这两个函数可以理解为java中的构造函数

类的赋值

类的拷贝

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值