python 面向对象 - 类 - 实例 - 类的使用 - self - init方法 - ATM面向对象实验

目录

面向过程和面向对象的对比?

面向对象

面向对象两个重要概念: => class(类)、实例

类:具有相同属性或方法的对象的集合

属性(变量):编号、位置、余额

方法(函数):查询余额,转帐功能,取钱,存钱

实例: 实实在在存在的东西(具体的某一个物品)

实例属性和类属性:

一、定义一个简单的ATM机系统的类(属性、方法、实例)

二、使用paramiko类来创建一个ssh连接(理解:类、实例、属性、方法) 

类的使用:(类、实例、属性、方法的使用)

self是什么?

类的init方法(实例初始化)

init方法中的参数

ATM系统 - 面向对象实验

ATM系统代码一:

ATM系统代码二:


面向过程和面向对象的对比?

面向过程编程 => 如何实现这个功能,侧重点在过程(函数(关注:怎么做))

面向对象编程 => 谁在做这件事(类(关注:谁在做什么))

面向过程编程是一种以过程为中心的编程范式。它将程序组织为一系列的函数或过程,每个函数都对应一个特定的任务,通过依次调用这些函数来完成程序的执行。面向过程编程注重解决问题的步骤和流程,强调解决问题所需要的算法和数据结构。

面向对象编程是一种以对象为中心的编程范式它将程序组织为一组相互作用的对象,每个对象都有自己的状态(属性)和行为(方法)对象之间通过消息传递来实现交互和协作,通过定义类来创建对象的具体实例。面向对象编程注重将真实世界的概念和关系映射到代码结构中,强调封装、继承和多态等特性。

ATM为例 => 可以用来查询余额,转帐功能,取钱,存钱...

面向过程: 查询余额,转帐功能,取钱,存钱 => 面向过程

面向对象: ATM能实现什么功能

面向对象

编程方式:面向过程  --》 侧重点:如何做 

                  面向对象  --》 侧重点:谁来做 (把多个属性(变量)和方法(函数)封装到一个对象中) 

                                          实例.属性 or 实例.方法()   来实现面向对象的编程

面向对象两个重要概念: => class(类)、实例

类:具有相同属性或方法的对象的集合

类是对具有相似特征和行为的对象进行抽象的模板。它定义了对象的属性(成员变量)和行为(方法)。可以将类看作是生成对象的蓝图或模板。

属性(变量):编号、位置、余额

方法(函数):查询余额,转帐功能,取钱,存钱

实例: 实实在在存在的东西(具体的某一个物品)

实例方法: def _init_(self):  pass (初始化实例)

                   def save(self):   pass

实例属性和类属性:

实例属性:每个实例独有的属性,每个实例的属性值都不一样

类属性:   所有实例共用的一个属性(所有实例的这个属性如果都相同,可以定义成类属性)

一、定义一个简单的ATM机系统的类(属性、方法、实例)

class ATM():
    # 类属性(所有实例都共用的)
    bank = "中国银行"

    # 初始化函数(每个实例的数据)
    # 初始化了三个数据 balance, no, location => 形式参数
    # self => 创建的这个实例
    def __init__(self, balance, no, location):
        # 实例属性(每个实例都有属性自己的值)
        self.balance = balance
        self.NO = no
        self.location = location

     # 实例方法
    def store_money(self, money):
        pass

# 生成一台ATM机 --》实例化 --》生成实例(某一个具体的对象)
atm1 = ATM(10000, "No.0001", "湖南长沙农大路农大支行")
atm2 = ATM(10000, "No.0002", "湖南长沙农大路农大支行")
# 打印实例的属性
print(atm1.NO)
print(atm1.location)

二、使用paramiko类来创建一个ssh连接(理解:类、实例、属性、方法) 

#安装paramiko类 >pip install paramiko
import paramiko
# 实例化SSH连接
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname="192.168.2.198", port="22", username="root", password="123456")
stdin, stdout, sdterr = ssh_client.exec_command("cd /bin;pwd")
# 这些返回的信息,只能read一次
print(stdout.read().decode("utf-8"))
print(dir(ssh_client))
ssh_client.close()

# with => 退出with语句块的时候,做一些清理工作
with paramiko.SSHClient() as ssh_client:
    ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh_client.connect(hostname="192.168.2.198", port="22", username="root", password="123456")
    stdin, stdout, sdterr = ssh_client.exec_command("cd /bin;pwd")
    # 这些返回的信息,只能read一次
    print(stdout.read().decode("utf-8"))

类的使用:(类、实例、属性、方法的使用)

实例化:atm1 = ATM(参数列表)

属性/方法的查找过程:1、先查找自身实例是否有这个属性

                                     2、如果没有,再去类中查找

                                     3、如果类中没有、去父类中查找

类/实例:可以给他动态的添加和删除属性的方法

类属性的使用:atm1.bank = "newdata"  -->给实例添加了一个bank属性

                         user1.user_dict[username][balance] = "newdata"  修改类属性user_dict字典的balance的值

# 封装性
class ATM():
    #类属性(所有的实例都共有)
    bank = "中国银行"

    # 定义初始化函数(里面定义的是每个实例的数据)
    # self--> 创建这个实例
    def __init__(self, balance, no, location):
        #初始化了三个数据 --> 形式参数
        #实例属性(每个实例都有属性自己的值) 着三个属性都是实例属性
        self.balance = balance
        self.NO = no
        self.location = location

    #定义的实例方法
    def store_money(self, money):
        pass

atm1 = ATM(1000, "NO.0001", "湖南长沙...")
atm1.store_money(money=1000)
atm2 = ATM(10000, "NO.0002", "湖南长沙...")

# 查看已经有的属性,调用存在的方法
print(atm1.location)
# 属性和方法查找的过程
# 1.去查找实例本身是否有这个属性
# 2.去类上查找属性
# 3.去父类上查找
print(atm1.bank)

# 修改属性(修改的是实例上的location属性)
# 修改实例属性,只影响实例的本身
atm1.location = "湖南农业大学"

print(atm1.location)  #湖南农业大学
print(atm2.location)  #湖南长沙...

# 用实例修改类属性
# 打印:实例
atm1.bank = "中国银行长沙分行"
print(atm1.bank)   #中国银行长沙分行   #atm1是自己创建了一个新的bank类属性,并给他赋值
print(atm2.bank)   #中国银行     #atm2是调用了ATM类中的bank类属性

#实例/类可以动态添加属性或方法
atm1.test = "这是一个测试数据"
print(atm1.test)  #这是一个测试数据
# print(atm2.test)  #报错,因为ATM类中不存在test类属性

ATM.bank = "new中国银行长沙分行"
print(atm1.bank)  #中国银行长沙分行
print(atm2.bank)  #new中国银行长沙分行

# 实例化一个atm3
# 创建atm3.bank
# atm3.bank
atm3 = ATM(1000,"N0.0003", "湖南农业大学")
print(atm3.bank)
print(dir(atm3))       #可以查看实例的选项
print(atm1.__dict__)   #可以查看到实例里面的值
print(atm2.__dict__)

self是什么?

self => 表示的是实例本身(用于表示当前对象的引用),通过 self,你可以访问对象的属性和调用对象的方法。

谁调用这个方法,self表示的就是谁。

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

    # self参数名可以改成其他的名字,一般会约定俗成的给self
    def info(this):
        print("this is ", this.name)

    def count(self, num):
        print("this is ", num)

# 为什么这里会多一个self参数
# self => 表示的是实例本身
a1 = A("a1_instance")
a1.info()   # A.info(a1)  # a1 => self
a1.count(1) # A.count(a1, 1)

类的init方法(实例初始化)

__init__函数的使用:可有可无
__init__函数什么情况下需要?
1. 实例化对象的时候,不需要为这个实例赋单独的值,可以省略__init__函数
2. 如果需要单独赋值,就将参数传递给__init__函数
3. self.实例属性 = 形参的名字

4. 实例化的时候: 类名(init函数中对应的参数) -> 不包含self

init方法中的参数

如 ATM(1000, "NO.0001", "nongda") -->就是将参数传递给初始函数

用于创建实例的方法会将参数传递给_init_函数 

"""
@author: wy
@file: 三创购物系统-面向对象.py
@time: 2023/7/24 11:35
加载用户信息、加载商品信息、登录、注册、展示商品信息...
"""

class A():
    pass

# __init__函数的使用:可有可无
# __init__函数什么情况下需要?
# 1. 实例化对象的时候,不需要为这个实例赋单独的值,可以省略__init__函数
# 2. 如果需要单独赋值,就将参数传递给__init__函数
# 3. self.实例属性 = 形参的名字
# 4. 实例化的时候: 类名(init函数中对应的参数) -> 不包含self
class User():pass


class ShoppingSystem():
    LOGIN_MAX = 3

    def __init__(self, goods_dict, user_dict):
        # 根据传递过来的参数,赋值给实例
        self.goods_dict = goods_dict
        self.user_dict = user_dict

    def login(self, username, password):
        if username in self.user_dict and \
            password == self.user_dict[username]["password"]:
            print("登录成功")
        else:
            print("登录失败")

    def regist(self, username, password, re_password):
        pass

    def get_carts_list(self):
        # 如果用户登录了才能展示
        pass

user_dict = {
    "root":{"password":"123456", "balance":"100"},
}
goods_dict = {}
sc_shoopingsystem = ShoppingSystem(goods_dict,user_dict)
print(sc_shoopingsystem.user_dict)
print(sc_shoopingsystem.goods_dict)
sc_shoopingsystem.login("root", "123456")

ATM系统 - 面向对象实验

ATM => 查询余额,取钱,存钱...

ATM系统代码一:

class User():
    user_dict = {
        "root": {"password": "123456", "balance": "100"},
    }

    def __init__(self, username, password):
        # auth => 当前登录状态False未登录
        self.auth = False
        self.login(username, password)

    def login(self, username, password):
        # self.user_dict 通过实例查询类属性 => ok .注意!如果是修改的话就不行了
        if username in self.user_dict and \
                password == self.user_dict[username]["password"]:
            self.auth = True
            self.username = username
            self.password = password
            self.balance = int(self.user_dict[username]["balance"])
            print(f"欢迎您!{self.username}")

    # 数据必须需要回收否则会导致数据无法更新,而写入数据库的数据就还是原数据
    def logout(self):
        self.auth = False
        self.user_dict[self.username]["balance"] = self.balance
        del self.username
        del self.password
        del self.balance


# 定义一个`中国银行ATM`的类
class ATM():
    # 类属性(所有实例都共用的)
    bank = "中国银行"

    # 初始化函数(每个实例的数据)
    # 初始化了三个数据 balance, no, location => 形式参数
    # self => 创建的这个实例
    def __init__(self, balance, no, location):
        # 实例属性(每个实例都有属性自己的值)
        self.balance = balance
        self.NO = no
        self.location = location

    #存钱
    def store_money(self):
        money = int(input("请输入需要存取的数额:"))
        self.balance += money
        print(f"存钱成功,您当前的余额为:{self.balance}")

    #取钱
    def draw_money(self):
        money = int(input("请输入需要取走的数额:"))
        if self.balance >= money:
            self.balance -= money
            print(f"取钱成功,余额为{self.balance}")
        else:
            print("您的余额不足")

    # 查看余额
    def get_balance(self):
        print(f"您当前的余额为:{self.balance}")

    def login(self):
        """登录"""
        username = input("请输入用户名:")
        password = input("请输入密码:")
        # 实例化一个用户
        user = User(username, password)
        if user.auth:
            self.current_user = user

    def logout(self):
        """退出"""
        self.current_user.logout()
        self.current_user = None


    def start(self):
        choice_func = {"1": self.get_balance,
                     "2": self.store_money,
                     "3": self.draw_money,
                     "4": self.logout}
        # 当前没有用户登录 :None,登录了,就是当前用户实例
        self.current_user = None
        while True:
            if self.current_user:
                choice = input("请输入您的操作(1、查询余额 2、存钱 3、取钱 4、退出系统):\n")
                choice_func[choice]()
                if choice == "4":
                    print("退出系统!")
                    break
            else:
                print("请登录ATM系统!")
                self.login()

atm = ATM(1000, "NO.0001", "湖南长沙...")
atm.start()

ATM系统代码二:


class ATM():
    #类属性(所有的实例都共有)
    bank = "中国银行"
    user_dict = {
        "root": {"password": "123456", "balance": "1000"}
    }

    # 定义初始化函数(里面定义的是每个实例的数据)
    # self--> 创建这个实例
    def __init__(self, balance, no, location):
        #初始化了三个数据 --> 形式参数
        #实例属性(每个实例都有属性自己的值) 着三个属性都是实例属性
        self.balance = balance
        self.NO = no
        self.location = location
        # auth => 当前登录状态False未登录
        #self.auth = False


    def login(self, username, password):
        if username in self.user_dict and \
            password == self.user_dict[username]["password"]:
            print("登录成功!")
            return True
        else:
            print("登录失败,请重新输入账号密码!")

    #定义的实例方法
    #查看余额
    def get_balance(self):
        print(f"您当前的余额为:{self.balance}")

    #存钱
    def store_money(self, money):
        self.balance += money
        print(f"存钱成功,您当前的余额为:{self.balance}")

    #取钱
    def draw_money(self, money):
        if self.balance >= money:
            self.balance -= money
            print(f"取钱成功,余额为{self.balance}")
        else:
            print("您的余额不足")


atm1 = ATM(1000, "NO.0001", "湖南长沙...")

# 操作系统
def system_op():
    while True:
        flag = input("请输入您的操作(1、存钱 2、取钱 3、查询余额 4、退出系统):")
        if flag == "1":
            money = input("请输入需要存取的数额:")
            atm1.store_money(int(money))
        elif flag == "2":
            money = input("请输入需要去出的数额:")
            atm1.draw_money(int(money))
        elif flag == "3":
            atm1.get_balance()
        else:
            print("退出系统!")
            break

#设置变量用于判断使用
judge = False

while True:
    #登录界面
    option = input("请输入你的选择(1、登录 2、注册 3、退出系统):\n")
    if option == "1":
        username = input("请输入用户名:")
        password = input("请输入密码:")
        judge = atm1.login(username, password)
    elif option == "2":
        pass
    else:
        print("退出系统!")
        break

    if judge:
        system_op()
        break
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值