一、概念
类:具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.
对象:万物皆对象
关系
类包含属性和方法
类是对像的模板
对象是类的事例
二、语法
class 类名:
属性
对象属性-->私有 共有
类属性-->私有 共有
方法
<1>公有方法
<2>私有方法
<3>属性方法
<4>静态方法
三、封装
创建对象
创建对象:属性写在类外的情况,通过对象.属性,对象.方法()的方式调用
<1>无参函数的调用(需要每个去赋值,比较啰嗦)
例:
class Person:
#属性 方法
'''
def声明方法的标识
eat 函数名 方法名
() 形参列表 形参:形式列表 (定义概念)
self 第一个参数 默认是当前对象的引用=地址指向
'''
def eat(self):
print('人在方法')
def sleep(self):
print('吃完睡觉')
if '__main__'.__eq__(__name__):
zhangsan=Person()
zhangsan.eat()
zhangsan.sleep()
执行命令得
人在方法
吃完睡觉
初始化:
<2>__init__(self):系统自动调用初始化方法,先生成对像,再调用此方法,再将对象赋值给引用名
用法:
def __int__(self,v_name,v_age):
self.name=v_name
self.age=v_age
有参函数的调用(可以直接全部赋值,比较简洁)
例:
class Person:
'''
带参-函数
'''
def __init__(self,name,age):
self.name=name
self.age=age
print('__init__ Person')
def eat(self):
print(self.name+'在吃饭')
def sleep(self):
print(self.name+'吃完睡觉')
def hello(self):
print('大家好,我是'+self.name+' 今年',self.age)
if '__main__'.__eq__(__name__):
zhangsan=Person('张三',19)#直接赋值参数
zhangsan.eat()
zhangsan.sleep()
zhangsan.hello()
执行命令得
__init__ Person
张三在吃饭
张三吃完睡觉
大家好,我是张三 今年 19
<3>重写;当需求系统自带不能满足时需要用到重写,即自己编写的规则
__str__():
return xxx
class Person:
def __init__(self,name,age):
self.name=name
self.age=age
def __str__(self):
#object 所有数据类型的基类 父类
return 'name:'+self.name+'age:'+str(self.age)
if '__main__'.__eq__(__name__):
zhangsan=Person('张三',19)
print(zhangsan)
print(str(zhangsan))#对上面未声明__str__函数时输出结果与 id相同
print(zhangsan.__str__())
print(id(zhangsan))
执行命令得
name:张三age:19
name:张三age:19
name:张三age:19
90743856
<4>属性相对于类来说属于全局 即:每个方法都可以调用
get/set方法:不写__init__()方法
set_name(self,new_name):
self.name=new_name
get_name(self);
return self.name
解释性语言:不需要预定义 随时创建随时使用
class Student:
def set_name(self,name):
self.name=name
def get_name(self):
return self.name
stu=Student()
stu.set_name("abc")#边执行边解释 或者写成 stu.name='abc'
print(stu.get_name())
执行命令得
abc
封装
class Person:
def setage(self,new_age):
'''
封装的意义 doc 注释==>文档注释
:param new_age: 新的年龄 0--100
:return: None
'''
if new_age<0 or new_age>100:
print('超出年龄限制 默认18')
self.__age__=18
else:
self.__age__=new_age
if '__main__'.__eq__(__name__):
zhangsan=Person()
zhangsan.setage(1000)
print('age:',zhangsan.__age__)
执行命令得
超出年龄限制 默认18
age: 18
四、
<1>公有方法;从外部直接调取的都是公有
私有方法:只能在内部调用,外部不允许访问(可以调用不是绝对的,一切靠自觉)
例如:__private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs
<2>自动销毁方法:
1.__del__():
xxx
当独想没有引用的时候,或程序结束的时候,程序自动调用__del__()
2.del 引用 科颜氏删除时自动调用__del__()
3.程序结束时自动调用__del__()
class Person:
def __show__(self):
print('哈哈')
def __del__(self):#自动删除
print('对象被删除..资源被释放')
if '__main__'.__eq__(__name__):
zhangsan=Person()
zhangsan.__show__()
lisi=zhangsan
del zhangsan#手动删除
for i in range(5):
print(i)
执行命令得
哈哈
0
1
2
3
4
对象被删除..资源被释放
<3>测试一个对象有多少个引用(有多少引用指向同一块空间)
import sys#导入
t=T()#引用
sys.getrefcount(t)返回 从2开始 #ref 引用传递
import sys
class Person:
def __show__(self):
print('哈哈')
if '__main__'.__eq__(__name__):
zhangsan=Person()
zhangsan.__show__()
lisi=zhangsan
print(sys.getrefcount(zhangsan))
执行命令得
哈哈
3
五、Python变量的命名规则 数字 /字母/ _
首字母不能是数字开头
非硬性要求规范:首字母小写 其余首字母大写
不能使用关键字
一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照规定俗称的规定,当你看到这样的变量时,意思就是"虽然我可以被访问,但是,请把我视为私有变量,不要随意访问".
双下划綫开头的实例变量是不是一定不能在外部访问呢?
其实也不是.不能直接访问__name是
class Person:
def __init__(self,name):
self.__name=name
if '__main__'.__eq__(__name__):
zhangsan=Person('张三')
print(zhangsan._Person__name)
执行命令得
张三
因为Python解释器对外把__name变量改成了_类名__name.所以仍然可以通过_类名__name来访问__name变量:
对一个对象的引用调用id()函数,可以得到该对象的标识符(dentity).该标识符是一个整数,它保证在该对象的生命周期内是唯一的和恒定的.具有不重叠生命周期的两个对象具有不同的id()值.