类的方法
普通方法:
定义格式:
def 方法名(self,参数1,参数2):
pass
调用:
都要依赖对象调用方法
对象名.方法名(参数)
注意: 在调用过程中会默认传递self对象,self表示的是对象本身
方法中访问对象属性:
self.属性名
self.属性名= 值 ----》 改变对象属性的值
方法中访问普通方法:
self.方法名(参数)
类方法:
工具方法
类方法:
定义格式:
@classmethod
def 类方法名(cls,参数):
pass
使用:
类名.方法名()
也可以通过:
对象.方法名() (了解)
静态方法:
定义格式:
@staticmethod
def 方法名():
pass
使用:
类名.方法名()
#类方法方法中能否访问对象属性?不能
#类方法,静态方法中能调用普通方法? 不能
class Utils:
# 类属性
version = '1.0'
def __init__(self, id):
self.id = id
# 类方法
@classmethod
def conn_db(cls): # cls其实就是类对象本身
print('classmethod---->', cls)
print('加载数据库驱动程序,当前版本号是:', cls.version)
print('数据库建立连接成功!')
# cls.select_data()
@staticmethod
def select_data(): # 参数:不依赖对象self,也不依赖类cls
print('查询数据库的数据,当前版本号是:', Utils.version)
Utils.conn_db()
def show(self):
print('----->show')
魔术方法:
魔术方法就是一个类的特殊方法,和普通方法唯一的不同时,普通方法需要调用!而魔术方法由系统自动调用
new;
实例化对象是Object类底层实现,其他类继承了Object的__new__才能够实现实例化对象。
没事别碰这个魔术方法,先触发__new__才会触发__init__
class Person:
def __init__(self):
print('----------->init')
def __new__(cls, *args, **kwargs):
print('----------->new')
obj = object.__new__(cls)
return obj
def __del__(self):
print('------------>del')
先调用new 给inti创建一块地址空间
私有化:只能类自身中进行调用,对象在外部无法通过.访问
实现属性或者方法的私有化要通过: __属性名,__方法名()
python中的私有化,底层对私有属性进行了改名操作: _类名__属性名 或者 _类名__方法名()
class Person:
def __init__(self, name):
self.name = name
self.__age = 20
def show_age(self):
print('我的年龄是:', self.__age)
def __test(self):
print('我是测试私有的test方法')
加上 "__"之后就变成私有,调用时名字自动改成 "_类名__属性名"
封装,继承,多态
- 属性和方法—》封装到类中
- 属性封装: 将属性私有化,并定义公有set和get方法
私有化作用:
1. 隐藏属性,只能在类中使用
2. 对私有属性的赋值和取值起到一定的限制作用
3. 通过set方法限制赋值,通过get限制取值
class Person:
# 限制属性作用
__slots__ = ['__name', '__age', '__flag']
def __init__(self, name, age):
self.__name = name
self.__age = age
self.__flag = True
def get_name(self):
if self.__flag:
return self.__name
else:
return '没有权限查看用户名'
def get_age(self):
return self.__age
def set_name(self, name):
if len(name) >= 6:
self.__name = name
else:
print('名字必须要大于等于6位')
def set_age(self, age):
if 125 > age > 0:
self.__age = age
else:
print('年龄赋值失败,必须在0~125范围内')
p = Person('lucy', 20)
print(p.get_name())
print(p.get_age())
p.set_name('steven')
print(p.get_name())
p.set_name('tom')
print(p.get_name())
p.set_age(10)
print(p.get_age())
@property 装饰器是用来装饰类中方法的
步骤:
- 在get方法上面添加@property装饰器,函数的名字最好更加简要,让使用者在调用或者访问的时候更加简单
- 装饰set方法:
@属性名.setter
def 属性名(self,参数):
pass
3.使用:
对象 = 类名(参数)
print(对象.属性名) -----> get方法
对象.属性名=值 -----》 set方法
class Person:
__slots__ = ['__name', '__age', '__flag', '__password']
def __init__(self, name, age):
self.__name = name
self.__pas
self.sword = '1234'
self.__age = age
self.__flag = False
@property
def name(self):
if self.__flag:
return self.__name
else:
return '没有权限查看用户名'
@name.setter
def name(self, name):
if len(name) >= 6:
self.__name = name
else:
print('名字必须要大于等于6位')
def get_age(self):
return self.__age
def set_age(self, age):
if 125 > age > 0:
self.__age = age
else:
print('年龄赋值失败,必须在0~125范围内')
def login(self, name, password):
if self.__name == name and self.__password == password:
print('登录成功!')
self.__flag = True
else:
print('用户名或者密码有误!')
p = Person('jack', 21)
p.login('jack', '124')
p.set_age(22)
print(p.get_age())
print(p.name)
p.name = 'steven'
print(p.name)
p.name = 'tom'
print(p.name)