# 装饰器
# 创建函数,在函数计算前,计算后打印输出
# 如果直接在函数中修改,函数过多很麻烦并且难以维护。
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)