Python:面向对象

news2024/9/23 23:32:29

目录

一、类的定义

基本语法

 python与Java关于类的封装的区别

 自定义构造方法

Java与Python的区别

源码

同一个类多种构造函数的构建

 源码

二、魔法方法

基础部分

比较部分

与Java的区别

容器类型

三、属性管理

四、封装

基础部分

方法拓展

五、继承&多态

继承

 多态


一、类的定义

基本语法

类的定义这两种都是可以的
# class Dog(object):
#     pass

# class Dog:
#     pass
class Dog:
    name = "小黑"
    age=2

d = Dog()
print(f'name is {d.name},age is {d.age}')

 python与Java关于类的封装的区别

# python与Java关于类的封装的区别:
# python中没有的属性是可以拓展的,而Java不可以
class Dog:
    name = "小黑"
    age=2

d = Dog()
print(f'name is {d.name},age is {d.age}')
# python与Java关于类的封装的区别:
# python中没有的属性是可以拓展的,而Java不可以
d.sex ="女"
print(f'name is {d.name},age is {d.age},sex is {d.sex}')

 自定义构造方法

Java与Python的区别

在Java中:直接给对象的属性赋值是不会报错的

在python中:直接给对象的属性赋值是会报错的,如图下

 python中修改对象的属性的两种方法:

①:用对象点出要修改的属性 重新赋值

 ②:写一个方法

 但是此时会存在一个问题,在实例化对象的时候,如果没有传入参数,则会报错

 在Java中如果传入了参数则会修改为传入的参数,没有传入则会是原来的值

此时要解决该错,只需给参数设置一个默认值

源码

# 自定义构造方法
# class Dog:
#     name = "小黑"
#     age=2
#
# d = Dog()
# d.name = "旺财"
# print(f'name is {d.name},age is {d.age}')


# class Dog:
#     name = "小黑"
#     age=2
#     def __init__(self,name,age): #self 等价于Java中的this
#         self.name = name
#         self.age = age
#
# d = Dog()
# # d.name = "旺财"
# print(f'name is {d.name},age is {d.age}')

 class Dog:
     def __init__(self,name="小黑",age=12): #self 等价于Java中的this
         self.name = name
         self.age = age

 d = Dog()
 # d.name = "旺财"
 print(f'name is {d.name},age is {d.age}')

同一个类多种构造函数的构建

 源码



class Dog:
    def __init__(self,*args,**kwargs): #self 等价于Java中的this
        if kwargs.get("name") != None:
            self.name = kwargs.get("name")
        if kwargs.get("age") != None:
            self.age = kwargs.get("age")

d = Dog(name="小黑",age=13)
# d.name = "旺财"
print(f'name is {d.name},age is {d.age}')

二、魔法方法

python中的魔法方法是一些可以让你对类添加“魔法”的特殊方法,它们经常是两个下划线包围来命名的。 魔法方法可以使Python的自由度变得更高,在面向对象方面表现的更好。

基础部分

init 被用于初始化实例对象,new方法创建对象后就会调用该方法对实例的属性进行初始化

class Dog:
    def __init__(self, name: str = "小黄", age: int = 12):
        self.name = name
        self.age = age

# d = Dog()  # 不会报错
# d = Dog(name="小白")  # 不会报错
d1 = Dog(name="小黑", age=20)
d = Dog(name=20, age="小黑") #报错
print(d)
print(f'name is {d.name};age is {d.age}')

会报警告

 del 是析构方法,当对象的引用计数变为0时,这个对象会被销毁掉,此时就会调用del方法

 类似于vue中的八大钩子函数

class T:
    def __del__(self):
        print("对象被销毁")
#         可以在这里做关闭连接 释放资源等事情

t = T()
# t指向0,此前创建的T的实例被销毁
print("1111")
t = 0
print("2222")

 call 允许一个类的实例像函数一样被调用,这是一个非常重要的特性

class T:
    def __call__(self, *args, **kwargs):
        print("类的实例可以像函数一样被调用")


t = T()
t()  # 相当于执行__call__方法体中的内容

 len 是内置函数,len(t) 会调用实例的 len 方法

class T:
    def __len__(self):
        return 110


t = T()
print(len(t))

 当被 str() 调用时, 调用该 str 方法

class Tu:
    def __str__(self):
        return f"我是{Tu.__name__}的一个实例"


t = Tu()
print(t)

 bool 可用于逻辑判断部分

class T:
    def __init__(self, age):
        self.age = age

    def __bool__(self):
        return self.age > 18


print(bool(T(17) and T(19)))

比较部分

  • lt(self, other)定义小于号的行为:x < y

  • le(self, other)定义小于等于号的行为:x <= y

  • eq(self, other)定义等于号的行为:x == y

  • ne(self, other)定义不等号的行为:x != y

  • gt(self, other)定义大于号的行为:x > y

  • ge(self, other)定义大于等于号的行为:x >= y

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

    def __lt__(self, other):
        return self.age < other.age

    def __eq__(self, other):
        return self.age == other.age


s1 = Student(3)
s2 = Student(4)
print(s1 < s2)
print(s1 == s2)
print(s1 is s2)

与Java的区别

is比较的是地址 s1==s2 在Java中比较的是地址 而python比较的是值 在Java中比较值的是equals

容器类型

getitem, setitem, delitem

getitem定义获取容器中指定元素的行为,相当于 self[key],

setitem 定义设置容器中指定元素的行为,相当于 self[key] = value,

delitem 定义删除容器中指定元素的行为,相当于 del self[key]。

字典就是实现了这三个魔法方法,才提供了以[]为基础的操作

class MyData:
    def __init__(self, data=None):
        if data is None:
            data = dict()
        self.data = data

    def __getitem__(self, item):
        return self.data.get(item)

    def __setitem__(self, key, value):
        self.data[key] = value

    def __delitem__(self, key):
        del self.data[key]


my_data = MyData()
my_data['name'] = '小刚'
my_data['age'] = 14
print(my_data['name'])
print(my_data['age'])

 如果一个对象实现了 iter , 那么它就是一个可迭代对象 如果既实现 iter 又实现 next ,那么它就是一个迭代器

class Color(object):
    def __init__(self):
        self.index = -1
        self.colors = ['red', 'white', 'black', 'green']

    def __iter__(self):
        self.index = -1
        return self

    def __next__(self):
        self.index += 1
        if self.index >= self.colors.__len__():
            raise StopIteration
        return self.colors[self.index]


color_object = Color()
# 遍历输出所有颜色
for color in color_object:
    print(color)

三、属性管理

class Plane(object):
    category = '飞机'


p1, p2 = Plane(), Plane()
# print(p1.category, p1.category) 
# Plane.category = '拖拉机'
# print(p1.category, p2.category)
print(p1.category, p1.category)
p1.category = '拖拉机'
print(p1.category, p2.category)

 

 这里主要涉及到了类属性与对象属性实例属性的区别 python中,实例属性存储在一个字典(dict)中,对于属性的操作,都是在操作这个字典

python中对象的属性为什么可以动态变化?

类属性同样是存储在字典中,只是这个字典是类的字典
可以通过类名和对象名来调用,但是只能通过类名修改,类属性对于该类对象是共享的
类的属性和方法存在在类的 dict 之中

属性寻找规则: 先找实例的 dict ,再去查找类的 dict

四、封装

基础部分

python中,使用一个下划线就等于向使用者宣布这个属性是私有的,但你仍然可以直接对其修改,单个 下划线更像是一种约定,而非技术上的强硬限制。即便使用了双下划线,也仍然有办法直接对其修改, 但这已经不是类所要解决的问题了,一个人执意破坏数据,他总是能找到办法。

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

    def get_name(self):
        return self.__name

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

    def get_age(self):
        return self.__age

    def set_age(self, age):
        self.__age = age


stu1 = Stu('小明', 14)
stu2 = Stu('小红', 14)
print(stu1.get_name(), stu1.get_age())
print(stu2.get_name(), stu2.get_age())

 还可以通过其他方式来实现封装

class Book:
    def __init__(self, price):
        self._price = price

    @property
    def price(self):
        return self._price

    @price.setter
    def price(self, price):
        if price > 0:
            self._price = price
        else:
            raise Exception('价格不能为负数')


book = Book(58.5)
print(book.price)
# book.price = -1
book.price = 1
print(book._price)

使用 @property 装饰器修饰 price 方法后,你就可以像使用属性一样使用 price ,如果你希望可以对price 进行赋值,那么需要用 @price.setter 装饰器再装饰一个方法,该方法完成对 _price 属性的赋值操作。

我们以为自己直接操作了对象的属性,但其实我们是在使用类的方法,而且关键的是省去了调用方法时 的那对小括号

方法拓展

类方法 : 可以通过类名调用的方法 加上注解,修改参数为 cls (当前类),可以通过 cls 调用类的属性

静态方法 : 可以通过类名与对象来调用,但是无法使用类变量

class Book:
    @classmethod
    def run(cls):
        print(cls.__name__)

    # @staticmethod
    # def say(cls):
    #     print(cls.__name__)   #报错
    #     print("hello world")
    @staticmethod
    def say():
        print("hello world")

    def __init__(self, price):
        self._price = price

    @property
    def price(self):
        return self._price

    @price.setter
    def price(self, price):
        if price > 0:
            self._price = price
        else:
            raise Exception('价格不能为负数')


book = Book(58.5)
print(book.price)
# book.price = -1
book.price = 1
print(book._price)

Book.run()
book.run()
Book.say()
book.say()
# self -->this
# cls --> 当前类

 类方法 与 静态方法的区别就在于一个可以传参,一个不可以传参,这个参数指的是当前类

五、继承&多态

继承

如果没有指定基类,会默认继承 object 类, object 是所有类的基类,它提供了一些常见方法, 比如str

class Dog(object):
    pass

 类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类

class A:
    pass


class B:
    pass


class C(A):
    pass


class D(C):
    pass


# class D(A,B):
#     pass

#查看继承关系
print(D.__bases__)
print(D.__mro__)

 

 属性及方法继承

class Father:
    money = 100

    def hello(self):
        print("hello world")


class Son(Father):
    pass


s = Son()
print(s.money)
s.hello()

 多继承遵循就近原则

class Father:
    money = 100

    def hello(self):

        print("hello world")


class Mother:
    money = 200

    def cook(self):
        print("煮饭")


class Son(Father, Mother):
    pass


s = Son()
print(s.money)
s.hello()
s.cook()

 多态

class Animal(object):
    def play(self):
        pass


class Tiger(Animal):
    def play(self):
        print("正在表演老虎吃人")


class Lion(Animal):
    def play(self):
        print("正在表演狮子跳火圈")


class Person(object):
    def show(self, a: Animal):
        print("动物开始表演了")
        a.play()


p = Person()
tiger = Tiger()
lion = Lion()
# 让老虎表演
p.show(tiger)
# 让狮子表演
p.show(lion)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/79158.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基础IO——系统调用文件

文章目录1. 知识补充和回顾1.1 回顾C文件接口1.2 理论理解2. 系统调用文件接口2.1 open2.2 怎么使用2.3 close和write2.4 read1. 知识补充和回顾 1. 文件文件内容文件属性。即使创建一个空文件&#xff0c;也会占据磁盘数据。 2. 文件操作文件内容操作文件属性操作。在操作文件…

域名+七牛云+PicGo+pypora

域名七牛云PicGopypora 前提准备&#xff1a; 域名&#xff08;自己的域名&#xff09;七牛云 免费注册申请10G空间够用picGo 地址pypora &#xff08;自行下载&#xff09; GO&#xff01;&#xff01;&#xff01; 七牛云 注册--->登录--->控制台找到对象存储新建…

如何在AndroidStudio中使用GitHub

文章目录1.确认是否安装git2.添加GitHub账户3.创建库4.创建分支5. push内容在项目中肯定要集成版本管理工具&#xff0c;不过有时候更换电脑或者升级AndroidStudio时原来集成的内容就不在了&#xff0c;还在再次集成git。时间长了就容易忘记如何集成Git&#xff0c;因此整理总结…

工作10年我面试过上百个程序员,真想对他们说…

V-xin&#xff1a;ruyuanhadeng获得600页原创精品文章汇总PDF 一、写在前面 最近收到不少读者反馈&#xff0c;说自己在应聘一些中大型互联网公司的Java工程师岗位时遇到了不少困惑。 这些同学说自己也做了精心准备&#xff0c;网上搜集了不少Java面试题&#xff0c;然而实际…

详解c++---内存管理

这里写目录标题c语言在堆上申请空间malloccallocreallocfreec中向堆中申请空间的形式new的介绍delete的介绍new与自定义类型new与malloc的不同定位newoperator new与operator delete函数c语言在堆上申请空间 在之前的学习中我们知道c语言主要是通过malloc free calloc&#xf…

Java基础-常用API的使用方法(Math,System,Runtime,Object,BigInteger,BigDecimal)(1)

1 Math类 1.1 概述 tips&#xff1a;了解内容 查看API文档&#xff0c;我们可以看到API文档中关于Math类的定义如下&#xff1a; Math类所在包为java.lang包&#xff0c;因此在使用的时候不需要进行导包。并且Math类被final修饰了&#xff0c;因此该类是不能被继承的。 Math类…

J - 食物链 POJ - 1182

思路&#xff1a; 首先我们要理清楚三种动物之间的关系&#xff0c;那么可以用A到B的距离为1代表为A吃B&#xff0c; 那么就有下图的关系 那么我们用d1表示吃&#xff0c;d2表示被吃&#xff0c;d3表示是同类 对于另一张图也是符合的 然后我们去找每个点和他的根节点的关系 …

resnet(4)------全连接层与softmax

文章目录1. 全连接层2. SoftMax算法1. 全连接层 全连接层&#xff0c;指的是每一个结点都与上一层的所有结点相连&#xff0c;用来把前面几层提取到的特征综合起来。 举个例子&#xff0c;前面通过卷积和池化层提取出来的特征有眼睛鼻子和嘴巴&#xff0c;那我们能单独通过这…

基于tensorflow的深层神经网络(一)为什么神经网络需要解决非线性和异或问题

参考为什么神经网络需要解决多层和非线性问题 - 云社区 - 腾讯云 维基百科对深度学习的精确定义为“一类通过多层非线性变换对高复杂性数据建模算法的合集”。因为深度神经网络是实现“多层非线性变换”最常用的一种方法&#xff0c;所以在实际中基本上可以认为深度学习就是深度…

音频信号特征

1.声音 音信号是由空气压力的变化而产生的&#xff0c;可以测量压力变化的强度&#xff0c;并绘制这些测量值随时间的变化。 声音信号经常在规律的、固定的区间内重复&#xff0c;每个波都具有相同形状&#xff0c;高度表示声音的强度&#xff0c;称之为振幅。 信号完成一个…

论文笔记-时序预测-FEDformer

论文标题&#xff1a;FEDformer: Frequency Enhanced Decomposed Transformer for Long-term Series Forecasting 论文链接&#xff1a; https://arxiv.org/abs/2201.12740 代码链接&#xff1a; https://github.com/DAMO-DI-ML/ICML2022-FEDformer 摘要 尽管基于变压器的方法…

笔记--Ubuntu20.04安装Nvidia驱动、CUDA Toolkit和CUDA CuDNN

目录 1--安装Nvidia驱动 2--安装CUDA 2-1--禁用nouveau 2-2--选择CUDA Toolkit 2-3--下载和安装CUDA Toolkit 2-4--配置环境变量 2-5--测试是否安装成功&#xff1a; 3--安装CUDA CuDNN 4--测试pytorch能否使用Cuda 1--安装Nvidia驱动 ① 查看可安装的Nvidia驱动版本…

Matplotlib学习笔记(第二章 2.13 Matplotlib中的图形(一))

在这里&#xff0c;您将发现大量示例图&#xff0c;其中包含生成它们的代码。 线图(Line Plot) 下面是如何使用plot()创建带有文本标签的线图。 Fig. 1: Simple Plot 多个绘图区域(Multiple subplots in one figure) 多个绘图区域由subplot()函数创建&#xff1a; Fig. 2:…

【小程序】内容滚动方案,视频或者照片上方不随滚动而滚动

&#x1f4ad;&#x1f4ad; ✨&#xff1a;内容滚动方案&#xff0c;视频或者照片上方不随滚动而滚动   &#x1f49f;&#xff1a;东非不开森的主页   &#x1f49c;: 优于别人&#xff0c;并不高贵&#xff0c;真正的高贵应该是优于过去的自己。——海明威&#x1f49c;&a…

【图像去噪】基于自适应滤波器消除椒盐噪声图像附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

web前端课程设计(HTML和CSS实现餐饮美食文化网站)静态HTML网页制作

&#x1f468;‍&#x1f393;静态网站的编写主要是用HTML DIVCSS JS等来完成页面的排版设计&#x1f469;‍&#x1f393;,常用的网页设计软件有Dreamweaver、EditPlus、HBuilderX、VScode 、Webstorm、Animate等等&#xff0c;用的最多的还是DW&#xff0c;当然不同软件写出的…

论文笔记-时序预测-Informer

论文标题&#xff1a; Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting 论文链接&#xff1a; https://arxiv.org/abs/2012.07436 源码链接&#xff1a; https://github.com/zhouhaoyi/ETDataset 摘要 许多实际应用都需要对长序列时间序列…

游戏开发55课 性能优化12

4.9 带宽优化 带宽优化的目的是减少CPU与GPU之间的数据传输。 4.9.1 LOD&#xff08;Level Of Detail&#xff09; LOD即细节层次&#xff0c;根据物体在画面的大小选用不同级别的资源&#xff0c;以减少渲染和带宽的消耗。LOD在图形渲染中应用广泛&#xff0c;适用的对象有…

au cs6七线阁教程 笔记

01 驱动 asio 02 I 监听 R录音 一般是单声道 03 调整音量声相 04 导出 删除轨道文件 07 删除选区 自定义波形剪辑颜色 录音激活后&#xff0c;监听才能激活 08 自动控制 默认控制音量&#xff1a; 09 效果器&#xff1a; Vst3 dll 插件 独立效果器面板&#xff0c;实时&a…

[附源码]Python计算机毕业设计SSM基于框架预约挂号系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…