python基础--装饰器、类的介绍(十)

    xiaoxiao2023-11-04  164

    # 装饰器 # 创建函数,在函数计算前,计算后打印输出 # 如果直接在函数中修改,函数过多很麻烦并且难以维护。 def add(a,b): r = a + b return r def mul(a,b): r = a * b return r print(add(123,23)) # 创建一个函数让这个函数自动生产函数 # begin_end函数就是装饰器,通过装饰器可以在不修改函数的情况下对函数进行扩展。 # 定义函数时,可以使用@装饰器来使用该装饰器来装饰需要装饰的函数。一个函数同时可以使用多个装饰器。 def begin_end(old): ''' *args : 接受任意数量参数 *kwargs : 接受任意关键字参数 ''' def new_func(*args,**kwargs): print('begin') res = old(*args,*kwargs) print('end') return res return new_func res = begin_end(add) res = begin_end(mul) print(res(123,123)) @begin_end def hello(): print('hello') hello() # 面向对象 # python是一门面向对象的编程语言,所谓面向对象的语言,简单来说就是语言中的所有操作都是通过对象来进行的 # 类 class MyClass: pass mc = MyClass() print(mc,type(mc)) class Person(object): print('start') # 在类中可以定义一些特殊的方法 # 这些特殊方法都是以__开头__结尾 # 特殊方法不需要我们自己调用,会在调用类的时候自动调用。 def __init__(self): print('init') pass # self 第一个参数self 就是调用对象本身 def say_hello(self): # print(self) print(self.name) p = Person() p1 = Person() p.name = 'jason1' p1.name = 'jason2' p.say_hello() # print(p) p1.say_hello() # print(p1) # 创建一个包含多个属性的类 class Dog: def __init__(self,name,age,gender,height): # 可以通过修改内部的属性名称来提高安全性 self.hide_name = name self.hide_age = age self.gender = gender self.height = height def set_name(self,name): # 在set方法中可以进行一些逻辑校验处理 self.hide_name = name def set_age(self,age): if age > 0: self.hide_age = age def get_name(self): return self.hide_name def get_age(self): return self.hide_age def run(self): print('run') def eat(self): print('eat') d = Dog('ha11',8,'男',20) # 在外部任然可以任意修改对象的属性,安全性非常低 # 这样就需要对这些属性进行封装,使外部无法访问一些属性来提高安全性。 # 使用封装增加了类定义的复杂度,但是确保了数据的安全性 # 隐藏属性名称,调用者无法随意修改对象中的属性 # 增加getter,setter方法,很好的控制属性是否只读,并且可以进行其他的一些逻辑处理。 # 使用setter设置属性,可以增加数据的验证 # # print(d.name,d.age,d.gender,d.height) print(d.set_age(-3)) print(d.get_age()) d.run() d.eat() # 可以给对象的属性使用双下划线__开头, # 双下划綫开头的属性是对象的隐藏属性,隐藏的属性只能在类的内部访问,无法通过对象访问。 class Rectangle: def __init__(self,width,height): self._width = width self._height = height def get_width(self): return self._width def get_height(self): return self._height def set_width(self,width): self._width = width def set_height(self,height): self._height = height def get_area(self): return self._height * self._width rect = Rectangle(12,12) print(rect.get_area()) # print(rect.__width) # 访问报错 # python内部给双下划线开头的属性自动加上了类名前缀 # 严格来说还是可以访问,一般都会使用_开头设置私有属性。 # print(rect._Rectangle__width) # property装饰器,用来将一个get方法转换为对象的属性 # 添加property装饰器后,我们就可以像调用属性一样使用get方法 # 使用property装饰器的方法名必须和属性名一样。 class Person: def __init__(self,name,age): self._name = name self._age = age @property def name(self): return self._name @name.setter def name(self,name): self._name = name @property def age(self): return self._age @age.setter def age(self,age): self._age = age p = Person('jack',15) print(p.name,p.age)

     

    最新回复(0)