Python之面向对象

news2024/9/21 17:54:53

目录

一、类的定义

二、魔法方法

三、属性管理

四、封装

五、继承&多态


一、类的定义

 


# 类封装
class Dog:
    name="修狗"
    age=3

d=Dog()
print(f'name is {d.name} ,age is {d.age}')
# python与java关于类封装的区别
d.sex="母"
print(f'name is {d.name} ,age is {d.age} ,sex is {d.sex}')
print("==============================")

 

# 构造函数
class Dog:
    name="修狗"
    age=3

 

 

class Dog:
   
 # 法1
 def __init__(self,name,age):  #self相当于java的this
     self.name=name
     self.age=age

d=Dog("哈士奇",7)

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

 

 

# 构造函数
class Dog:

 # # 法2
    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="huhu",age=12)
print(f'name is {d.name} ,age is {d.age}')

 


二、魔法方法

 

# 魔法方法
# init 被用于初始化实例对象,new方法创建对象后就会调用该方法对实例的属性进行初始化。
class Dog:
    def __init__(self, name: str = "小黄", age: int = 12):
        self.name = name
        self.age = age


# d = Dog()  # 不会报错
# d = Dog(name="小白")  # 不会报错
d = Dog(name="小黑", age=20)
# d = Dog(name=20, age="小黑") #报错
print(d)
print(f'name is {d.name};age is {d.age}')
print("==========================================")
#del 是析构方法,当对象的引用计数变为0时,这个对象会被销毁掉,此时就会调用del方法
class T:
    def __del__(self):
        print("对象被销毁")


t = T()
# t指向0,此前创建的T的实例被销毁
print("1111")
t = 0
print("2222")
print("==========================================")
# call 允许一个类的实例像函数一样被调用,这是一个非常重要的特性
class T:
    def __call__(self, *args, **kwargs):
        print("类的实例可以像函数一样被调用")


t = T()
t()  # 相当于执行__call__方法体中的内容
print("==========================================")
# len 是内置函数,len(t) 会调用实例的 **len** 方法
class T:
    def __len__(self):
        return 110


t = T()
print(len(t))
# 当被 str() 调用时, 调用该 **str** 方法
print("==========================================")
class Tu:
    def __str__(self):
        return f"我是{Tu.__name__}的一个实例"


t = Tu()
print(t)
print("==========================================")
# bool 可用于逻辑判断部分
class T:
    def __init__(self, age):
        self.age = age

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


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

print("==========================================")

# 比较部分
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

# 对象之间是没有可比性的 less than-->小于 grant than -->大于
s1 = Student(3)
s2 = Student(4)
print(s1 < s2)
print(s1 == s2)#比较的是数值  相当于java里的“equals”
print(s1 is s2) #比较的是地址 相当于java里的“==”


print("==========================================")
# 字典就是实现了这三个魔法方法,才提供了以[]为基础的操作class MyData:
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'])

print("==========================================")
# 如果一个对象实现了 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 = '飞机'
    def fly(self):
      print("哈哈哈哈哈")

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)
print("=================================")
# 这里主要涉及到了类属性与对象属性实例属性的区别
p1.name = 'sa'
p1.__dict__['pwd'] = '123'
print(p1.__dict__)  #对象属性实例属性
print(Plane.__dict__) #类属性

print("=================================")
# 例题1
class Dog:
    name: str = '小黑'
    age: int = 3


d1 = Dog()
d1.name = "大黄"
d2 = Dog()
Dog.name = "小白"
print(d1.name)
print(d2.name)

 


 

四、封装

 

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进行赋值,那么需要用 @ price.setter装饰器再装饰一个方法,该方法完成对 _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)

 

 

 

 方法拓展
 类方法 : 可以通过类名调用的方法
加上注解,修改参数为 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()

 


五、继承&多态

# 继承&多态
class A:
    pass


class B:
    pass


class C(A):
    pass


class D(C):
    pass


# class D(A,B):
#     pass

#查看继承关系
print(D.__bases__)
# 查看D继承的全部父类关系
print(D.__mro__)

print("================================")
# 属性及方法继承
class Father:
    money = 100

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


class Son(Father):
    pass


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


print("================================")

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()


print("================================")
# 多态
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/60224.html

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

相关文章

逸飞激光在科创板IPO过会:前三季度营收约3亿元,同比增长59%

近日&#xff0c;上海证券交易所科创板披露的信息显示&#xff0c;武汉逸飞激光股份有限公司&#xff08;下称“逸飞激光”&#xff09;获得上市委会议通过。据贝多财经了解&#xff0c;逸飞激光于2022年6月24日在科创板递交招股书。 本次冲刺科创板上市&#xff0c;逸飞激光计…

【大数据入门核心技术-Hadoop】Hadoop高可用集群搭建

目录 一、Hadoop部署的三种方式 1、Standalone mode&#xff08;独立模式&#xff09; 2、Pseudo-Distributed mode&#xff08;伪分布式模式&#xff09; 3、Cluster mode&#xff08;集群模式&#xff09; 二、准备工作 1、先完成zk高可用搭建 2、/etc/hosts增加内容 …

数据科学家赚多少?数据全分析与可视化 ⛵

&#x1f4a1; 作者&#xff1a;韩信子ShowMeAI &#x1f4d8; 数据分析实战系列&#xff1a;https://www.showmeai.tech/tutorials/40 &#x1f4d8; AI 岗位&攻略系列&#xff1a;https://www.showmeai.tech/tutorials/47 &#x1f4d8; 本文地址&#xff1a;https://www…

[附源码]计算机毕业设计JAVA一点到家小区微帮服务系统

[附源码]计算机毕业设计JAVA一点到家小区微帮服务系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM…

Linux简单命令

Linux简单命令 现在写几个使用Linux时最常使用的简单命令 1.将一个文件复制到另一个文件夹内&#xff0c;比如将backboneA复制到backboneB路径下&#xff1a; cp -r /文件夹路径backboneA/* /文件夹路径backboneB/2.查看当前目录下有多少个文件及文件夹&#xff0c;需在终端输…

C++闲谈04——设计模式

C闲谈04——设计模式 单例模式 饿汉式单例模式 #include<iostream> #include<mutex>using namespace std; mutex mtx;class SingleTon{ public:static SingleTon* GetInstance() {if (instance nullptr) {lock_guard<mutex> lk(mtx); // 不是尖括号inst…

修复 爱普生 EPSON L4156 打印机 无法打印,开关 WIFI 墨水 三个灯同时闪烁的问题

L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4169 喷墨一体机清零图解 清零前请取消打印任务&#xff0c;打印机用 USB 线接电脑并开启 工具下载地址 EPSON打印机清零软件1.双击[Resetter.exe]启动软件,点击[Select],选择 Port 打 印机型号&#xff0c;然后点[OK]&#…

第8章 注意力机制与外部记忆

系列文章目录 第1章 绪论 第2章 机器学习概述 第3章 线性模型 第4章 前馈神经网络 第5章 卷积神经网络 第6章 循环神经网络 第7章 网络优化与正则化 第8章 注意力机制与外部记忆 第9章 无监督学习 第10章 模型独立的学习方式 第11章 概率图模型 第12章 深度信念网络 第13章 深…

Linux UART编程 驱动蓝牙芯片

在熟悉了UART概念后&#xff0c;我们要学以致用&#xff0c;在Linux用起来来驱动起来蓝牙芯片&#xff01; 我们直接借用man来看下&#xff0c;命令如下&#xff1a; man termios 1.头文件引用 #include <termios.h> #include <unistd.h> 2.串口打开关闭 open…

Python预测2022世界杯1/8决赛胜负

目录: why to do?how to do?why to do? 简单介绍一下为什么要做这个吧? 首先呢, 最近一直在看基于tensorflow框架实现facenet等一些人脸识别的网络. 再加上昨天(2022年12月3日)是2022年世界杯1/8决赛第一个比赛日. 就在不同平台搜了一下, 看看有没有其他大牛也做了这方面的…

设计模式——策略模式

设计模式中的复用性指的是编译单位&#xff08;二进制层面&#xff09;的复用性&#xff08;编译、测试、部署后是原封不动的&#xff09; 动机&#xff08;Motivation&#xff09; 在软件构建过程中&#xff0c;某些对象使用的算法可能多种多样&#xff0c;经常改变&#xf…

Netty系列(五):源码解读ServerBootstrapAcceptor类职能,探究Netty启动流程

ServerBootstrapAcceptor是Netty服务端用来接收客户端连接的核心类&#xff0c;本文将介绍ServerBootstrapAcceptor的职能。 init方法 在上一篇文章源码解读 backlog 参数作用中我们知道&#xff0c;在Netty服务端启动时&#xff0c;会调用ServerBootstrap.bind()绑定本地端口…

玩转GDAL一文带你深入Windows下FileGDB驱动支持

前言 了解GDAL的朋友一定知道&#xff0c;GDAL3.5以下&#xff08;含&#xff09;默认配置下是只支持gdb文件的读的&#xff0c;是不支持写的。更要命的是&#xff0c;默认的OpenFileGDB在读取时&#xff0c;如果我们在矢量文件中设置了属性表字段的别名&#xff0c;默认驱动是…

Git项目演练

Git项目演练 首先&#xff0c;进入到项目路径 然后&#xff0c;初始化&#xff0c;产生.git库 创建gitignore文件 将不需要的文件放入到,gitignore 将所有的文件添加到追踪的状态 对文件进行一次提交 使用git log查看变动 使用编译器修改代码中的内容 对修改进…

基于javaweb的学籍管理系统计算机毕业论文java毕业设计选题源代码

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 计算机毕业设计java毕设之基于javaweb的学籍管理系统-IT实战营_哔哩哔哩_bilibili项目资料网址: http://itzygogogo.com软件下载地址:http://itzy…

【能效管理】安科瑞新能源充电桩收费运维管理云平台应用分析

概述 AcrelCloud-9000安科瑞充电桩收费运营云平台系统通过物联网技术对接入系统的汽车充电站、电动自行车充电站以及各个充电桩进行不间断地数据采集和监控&#xff0c;实时监控充电桩运行状态&#xff0c;进行充电服务、支付管理&#xff0c;交易结算&#xff0c;资源管理、电…

ADSP-21569/ADSP-21593的开发入门(上)

作者的话 ADI的SHARC系列DSP&#xff0c;目前已经出到5系列了&#xff0c;最新的一颗叫2159x&#xff0c;按照ADI的说法&#xff0c;这颗DSP的性能是21569的两倍&#xff0c;但又能和21569做P2P的替换&#xff0c;所以下面我们就以21593为例&#xff0c;写一点资料&#xff0c…

头歌计算机组成原理MIPS RAM设计

完整答案点击底部 <?xml version"1.0" encoding"UTF-8" standalone"no"?> <project source"2.15.0.2.exe" version"1.0"> This file is intended to be loaded by Logisim http://logisim.altervista.org &l…

数字化门店| 旧衣回收店系统 | 智慧门店小程序开发教程

随着人们生活质量的提升&#xff0c;无论男女&#xff0c;衣柜鞋柜里摆满了各种衣物&#xff0c;覆盖了多个场景下的衣物非常多&#xff0c;同时如今大多数人已经不再穿补丁衣服&#xff0c;旧或破就会扔掉买新的。为了节省资源及合理二次利用&#xff0c;旧衣回收行业逐渐出现…

用译码器来设计组合逻辑电路

三线到八线&#xff1a;输入端只有三个所以只能是三变量 我们先来看书上的一个例子 设计的过程第一步 将函数表达式整理成最小项和的形式 我们用来举例&#xff0c;不是最小项的形式 三变量函数可以用三变量的最小项来表示 为了看的更清楚&#xff0c;我们写成最小项的编号&…