# Python中的函数定义
# def sum():
# print('123')
# sum()
# 参数类型:必传参数、关键字参数、缺省参数、万能参数。
# 必传参数:形参和实参的个数必须保持一致,不一致就会出现异常。
def sum(age, name):
print(age, name)
sum(20, '张三')
def sum1(age, is_male=False, name=None):
# is_male和name称为缺省参数:这两个参数可以传实参,也可以不传实参。相当于这两个参数有默认值。
print(age, is_male, name)
sum1(40)
sum1(50, True, '张三')
# 关键字参数
sum1(age=10, name='张三')
def sum2(*args, **kwargs):
# *args(元组)和**kwargs(字典)就是万能参数:可以传递任意参数,这两个形参都能接收
print('args = ', args)
print('kwargs = ', kwargs)
sum2(1, 2, 3)
sum2(name='张三', age=20, is_male=False)
sum2(1, 2, name='1', age=222)
# 函数内部返回值
def sum3():
# 可以返回多个值
return '123', 20, True
result = sum3()
print(type(result))
print(result)
# 局部变量和全局变量
# 局部变量:函数内部声明的变量是局部变量,局部变量的作用域是只能在当前函数内部使用,在函数执行完毕之后,这些局部变量所占用的内存空间会被系统回收,那么局部变量就不能使用了。
# 全局变量:在函数外部声明的变量一般称为全局变量,全局变量的作用域是整个.py文件都可以使用,在程序执行完毕之后,全局变量占用内存会被系统回收。
#
# def show():
# # u_name和u_age就是局部变量。
# u_name = '1'
# u_age = 20
# print(u_name, u_age)
#
# print(u_name)
u_name = 'a' # 全局变量
def show():
# 如果在函数内部,只是引用这个全局变量的值,直接引用即可。
# print(u_name)
# res = '姓名是:' + u_name
# print(res)
# 如果需要在函数内部,修改这个全局变量u_name的值,需要使用global关键字声明
global u_name
u_name = 'abc'
show()
print(u_name)
# 类和对象
# 类:主要是将函数(方法)和变量(属性)封装到一个类中,方便引用和管理。
# 对象:它是类的实例,主要负责调用类中封装的属性和方法。
# 知识点:
# 1. self和super关键字的区别;
# 2. 一些内置的装饰器: @property、@classmethod、@staticmethod;
# 3. 指针和内存地址之间的关系;
# 4. 类中私有变量的设置;
# 5. 类的继承的作用、特点及使用;
# 6. 类中方法的重写;
# 7. 类的多继承;
# object是Python中类的根类、最底层的类,所有的类都最终继承于object类;
class People(object):
"""
自定义类的描述
"""
# 类属性
name = '123'
def __init__(self, u_name, u_age):
"""
该方法就是对象的初始化方法,当对象被创建完成之后,会自动调用这个方法,用于给对象初始化一些属性。对象的创建使用的__new__(self)方法,该方法会给对象开辟内存空间。
self: 表示当前类的对象,类似于this。
当创建一个People对象p1,那么程序就会将类中的属性拷贝到对象p1的内存中;
当创建一个People对象p2,那么程序就会将类中的属性拷贝到对象p2的内存中;
所以,当p1对象去调用这些属性和方法的时候,self指的就是p1对象;
所以,当p2对象去调用这些属性和方法的时候,self指的就是p2对象;
总结:哪一个对象在调用类中的方法和属性,self指的就是这个对象;
"""
# 给对象初始化属性,__init__()中的属性称为对象属性或者实例属性,这些属性主要就是用来保存数据的。而这些被保存的数据是放在对象的内存空间中的。
self.u_name = u_name
self.u_age = u_age
def add_student(self):
print('self = ', self)
# self不需要我们给它传递实参,self的实参是由Python解释器传递的。自定义的参数可以写在self的后面。
print(self.u_age, self.u_name)
@classmethod
def update_student(cls, number):
print('----', cls, number)
p1 = People('张三1', 20)
print('p1 = ', p1.u_age)
p1.add_student()
p1.update_student(100)
p2 = People('张三2', 20)
print('p2 = ', p2.u_age)
p2.add_student()
p2.update_student(200)
# 类属性:所有的对象公有的属性,如果其中一个对象修改了类属性的值,其它对象也会受到影响。类属性既可以使用类名Poeple调用,也可以使用对象p1/p2调用。
# 对象属性:所有的对象都拥有自己的属性,放在自己的内存空间中,修改实例属性的值只对自己产生影响,不会对别的对象的属性产生影响。对象属性(实例属性)只能由实例对象调用,不能使用类名People调用。
print(People.name, p1.name, p2.name)
# 静态方法:
# 类方法@classmethod def replceSpace(cls):类方法既可以使用类名Poeple调用,也可以使用对象p1/p2调用。
# 对象方法(实例方法)def insert(self):对象方法(实例方法)只能由实例对象调用,不能使用类名People调用。
# 工具类()/数据操作类
class DBTool(object):
"""
处理数据库的工具类
"""
# @classmethod:装饰器
@classmethod
def insert(cls):
# cls指代的是当前类People,不能再使用self了。
pass
@classmethod
def update(cls):
pass
class StrTool(object):
"""
处理字符串的工具类
"""
@classmethod
def removeSpace(cls):
pass
@classmethod
def replceSpace(cls):
pass
# db = DBTool() # 占用内存
# s = StrTool() # 占用内存
DBTool.insert()
DBTool.update()
# 练习:学员管理系统 将数据保存到本地数据库中进行持久化(sqlite3)
# 要求:
# 1. 一个工具类,主要封装数据库中表的增删该查方法;
# 2. 一个数据类,主要封装和数据相关的方法和属性;