栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python全栈核心提炼-第一章:python基础-类

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python全栈核心提炼-第一章:python基础-类

python全栈核心提炼-第一章:python基础-类 一:概念阐述 面向对象

因为提高了代码的复用性,开发效率高,而且便于扩展迭代,所以成为了主流的开发思想。其中的核心概念就是类,在面向对象的思想中,可以用类来抽象一切的事物

抽象一类事物为一个模型。用__属性__和__方法__来描述

属性

描述一类事物的属性,本质上是类中的变量。包括两种:

实例属性:这个类的对象的一种__个体的属性__

类属性:这个类所有对象的一种__整体的属性__

方法

描述一类事物的行为,本质上是类中的函数。包括三种:

实例方法:

self: 实例方法中,自动添加的一个参数,代表调用此方法的对象。

类方法:

cls: 实例方法中,自动添加的一个参数,代表调用此方法的类。用@classmethod装饰

静态方法:

既不使用self,也不使用cls的方法。用@staticmethod装饰

调用方法的两种方式:

  1. 对象调用方法

  2. 类名调用方法

对象

是具体的一个一个的事物,由__类__制造而成。

实例化

类制造对象的过程

class Person(object):  # 创建类
	pass

if __name__ == '__main__':
    p1 = Person()  # 类加括号:实例化一个对象
二:python中的顶级父类及其属性和方法

object:顶级父类,继承的源头,默认继承它

_class_: 查看实例化这个对象的类

_bases_:查看父类

_dict_: 字典形式__显示属性__

dir(类名):查看类的方法

_new_(): 创建对象

_init_():初始化对象的属性,创建对象自动调用,可以设置默认参数

_str_():打印对象信息,必须return字符串,print(对象)的时候

_repr_():打印对象信息,必须return字符串,print(对象容器)的时候,例如[obj1, obj2,…]

type:顶级元类,实例化的源头,一般了解即可

class Person(object):  # 创建类
    def __init__(self, name):
        self.name = name

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

    def __str__(self):
        return self.name


if __name__ == '__main__':
    p1 = Person('lisi')  # 类加括号:实例化一个对象
    print('----------------------查看属性和方法-----------------------')
    print(p1.__dict__)  # 以字典形式打印对象属性
    print(dir(Person))  # 打印类的方法

    print('-----------------__class__-----__bases__----------------')
    print(p1.__class__)  # 实例化此对象的类
    print(Person.__bases__)  # 此类的父类们

    print('----------了解---------object-------type-----------------')
    print(object.__class__)  # 实例化object这个对象的是 type这个顶级元类
    print(object.__bases__)  # object没有父类
    print(type.__class__)  # 实例化type这个对象的类是它自己
    print(type.__bases__)  # type的父类是object这个顶级父类

运行结果

----------------------查看属性和方法-----------------------
{'name': 'lisi'}
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'eat']
-----------------__class__-----__bases__------------------

(,)
----------了解---------object-------type----------------------

()

(,)
三:类的三大特性 1 继承

继承:指类与类之间的一种重要关系。

举例说明下,现在有两个类,A类和B类,B类继承了A类,那么B称为A的子类,A称为B的父类。B类实例化的对象可以使用A类的属性和方法

2 多态

多态:同一个方法,不用对象来调用,结果不同

实现多态的方式: 在继承的基础上__重写__

重写:

当父类的方法不能满足子类使用,子类重新写父类的方法。重写的方法和父类方法,函数名相同

注意:__子类重写__init__()__这个方法,添加新的属性,__需要调用父类的__init__()方法__来初始化从父类继承来的属性,否则父类属性无法使用。下面为调用的两种方法:

super().__init__()

父类名.__init__(self)

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

class Cat(Animal):
    def eat(self):
        print('猫吃鱼')

class Dog(Animal):
    def eat(self):
        print('狗吃肉')

class Person:  # python不继承也可以实现多态
    def eat(self):
        print('人干饭')

def show(obj):
    obj.eat()  # 统一调用类的方法

show(Animal())
show(Dog())
show(Cat())
show(Person())


# show(Animal)  # 不能把 类名 放进去
# show(Dog)
# show(Cat)
# show(Person)

运行结果

动物会吃
狗吃肉
猫吃鱼
人干饭
3 封装

python中,封装属性,方法的办法是:

在属性和方法前面加__两个下滑线__,例如:‘__属性’,‘__方法’

class Student:
    def __init__(self, name, age):
        self.name = name
        self.__age = age  # __ 防止在类的外部使用

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

    def __show2(self):
        print('测试封装方法')


stu = Student('张三', 23)
stu.show()
# stu.__show2()  #AttributeError: 'Student' object has no attribute '__show2'
print(stu.name)
# print(stu.__age)  # AttributeError: 'Student' object has no attribute '__age'
print('-----------------------------------------------')

运行结果:

张三 23
张三
-----------------------------------------

封装属性,是为了类来控制+` 对属性的读写。

使用装饰器__@property和@属性名.setter__,可以很好控制属性的访问

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

    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self, new_name):
        self.__name = new_name

    @property
    def age(self):
        return self.__age
    # 注释掉,就不能外部修改了
    # @age.setter
    # def age(self, new_age):
    #     self.__age = new_age

if __name__ == '__main__':
    s1 = Student('qq', 12)
    print(s1.name)
    s1.name = 'hahaha'
    print(s1.name)

    print(s1.age)
    s1.age = 20
    print(s1.age)

运行结果:

AttributeError: can't set attribute
qq
hahaha
12
四:类的设计

高内聚,低耦合。尽可能的__精细化设计__,减少相互干扰

开闭原则

开闭原则(Open-Closed Principle,OCP)是指一个__软件实体(如类、模块和函数)__应该对扩展开放,对修改关闭。

就是不修改类或函数,而是添加类或函数

实现方法:

1.基于接口而非实现编程,即__父类不实现具体功能__

2.用多态替换if

单一职责原则

单一职责原则(Single Responsibility Principle):一个类(class)只负责一件事。如果一个类承担多个职责,那么它就会变得耦合起来。一个职责的变更会导致另一职责的变更。

注意:该原理不仅适用于类,而且适用于软件组件和微服务。

就是设计类或函数,功能要尽量单一,减少耦合

迪米特原则

迪米特原则(Law of Demeter,LoD), 一个对象应该对其他对象有最少的了解。

就是类尽量封装属性和方法,减少耦合

总结一下类的设计:

父类做接口不实现具体功能

使用多态代替if

类的属性和方法尽量封装

类和方法的功能尽量单一

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/853764.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号