Python基础学习_类的练习二

文章介绍了Python类中如何更改属性,包括设置和增加就餐人数的方法。同时,展示了如何使用`setattr()`和`getattr()`动态处理类中的关键字参数,允许在类的方法中遍历和访问这些参数。通过示例展示了`User`类的登录尝试次数的增加和重置功能。
摘要由CSDN通过智能技术生成

笔记比较简单,下面展示了类中属性更改的方式,以及对昨天最后一题类中任意关键字实参的初始化以及在类的方法中遍历的方式

1 就餐人数

在Restaurant类中添加统计就餐人数的方法

lass Restaurant():
    """显示餐馆信息"""
    ## 餐馆属性
    def __init__(self,restaurant_name,cuisine_type):
        self.restaurant_name = restaurant_name
        self.cuisine_type    = cuisine_type
        self.number_served = 0
    
    ## 餐馆方法
    def describle_restaurant(self):
        print("The restaurant name is " + self.restaurant_name.title() + ".")
        print("The restaurant cuisine_type is " + self.cuisine_type.title() + '.')
    
    
    def open_restaurant(self):
        print(self.restaurant_name + " 餐馆正在营业,欢迎你的到来!")
    
     ## 统计就餐人数方法
    def set_served(self,person_number):
        """设置餐馆就餐人数"""
        self.number_served = person_number
        print("The restaurant have " + str(self.number_served ) +
               " people " + " on eating.")
    
    ## 增加就餐人数的方法
    def increment_number_served(self,number):
        """增加定值的就餐人数"""
        self.number_served += number
        print("The restaurant have " + str(self.number_served ) +
              " people " + " on eating.")

实例化对象

r1 = Restaurant('muli', 'ol')
r1.describle_restaurant()
r1.open_restaurant()

r1.set_served(2000)
r1.increment_number_served(100)

结果:

The restaurant name is Muli.
The restaurant cuisine_type is Ol.
muli 餐馆正在营业,欢迎你的到来!
The restaurant have 2000 people  on eating.
The restaurant have 2100 people  on eating.

2 尝试登录次数

class User():
    """显示用户信息"""
    
    ## 用户属性
    def __init__(self,first_name,last_name,**user_info):
        
        ## 设置已知属性
        self.first_name = first_name
        self.last_name  = last_name 
        self.login_attempts = 0
        
        ## 设置未知属性
        for k,v in user_info.items():
            setattr(self, k, v)
            
    ## 用户方法
    def describle_user(self):
        
        ## 已知属性打印
        print("name" ," : ",self.first_name)
        print("last_name"," : ",self.last_name)
        
        ## 未知属性打印
         ## 遍历setattr()函数
        for key in self.__dict__:
            print(key,": ",getattr(self,key))
        
    ## 用户登录次数方法
    def increment_login_attempts(self,num):
        """用户登录次数增加函数"""
        
        self.login_attempts += num
        print("当前登录次数:",self.login_attempts)
    
    ## 重置用户登录次数方法
    def reset_login_attempts(self):
        """重置用户登录次数"""
        
        self.login_attempts = 0
        print("当前登录次数:",self.login_attempts)

setattr()和getattr()方法的介绍

setattr函数用于在对象中设置指定属性的值

setattr(obj, name, value)

其中,obj是要设置属性值的对象,name是要设置的属性名,value是要设置的属性值。
例子:

class MyClass:
    def __init__(self, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)
    
    def my_func(self):
        if hasattr(self, 'my_param'):
            print(getattr(self, 'my_param'))
        else:
            print('my_param not found')

所以 setattr(obj,name,value) 方法三个参数可以设置为 self , key, value
getattr()方法介绍:getattr函数用于获取对象的属性值。它的语法如下:

getattr(obj, name[, default])

例子如下:

class MyClass:
    def __init__(self, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)
    
    def my_func(self):
        for key in self.__dict__:
            print(key, getattr(self, key))

从中可以看出,setattr(self,key,value) 和 getattr(self,key) 两个方法共用可以在类中接受任意关键字参数,并在类的方法中遍历任意位置参数

实例化对象

u1 = User('wang', 'wei', location="wuhang", work='jixiegongcheng')
u1.describle_user()

print("location:", u1.location)
print("work: ", u1.work)

结果:

name  :  wang
last_name  :  wei
first_name :  wang
last_name :  wei
login_attempts :  0
location :  wuhang
work :  jixiegongcheng
location: wuhang
work:  jixiegongcheng
 print("location:", u1.location)
 print("work: ", u1.work)

上面两句话等价于类中方法下面几段代码

   ## 未知属性打印
         ## 遍历setattr()函数
        for key in self.__dict__:
            print(key,": ",getattr(self,key))

多次设置访问次数并多次重置访问次数

u1.increment_login_attempts(5)
u1.reset_login_attempts()


u1.increment_login_attempts(100)
u1.reset_login_attempts()


u1.increment_login_attempts(1000000)
u1.reset_login_attempts()

结果:

当前登录次数: 5
当前登录次数: 0
当前登录次数: 100
当前登录次数: 0
当前登录次数: 1000000
当前登录次数: 0

总结:

1、类的属性更改方法:通过实例调用属性来更改或者在类中设置更新类属性的方法
2、类中接受任意位置参数并遍历的方法:需要结合setattr()方法和getattr()方法
注意:如果在类字典中的键名与类的现有属性名重复,那么setattr函数将会覆盖现有属性的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值