一、概念
类:具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.
对象:万物皆对象
关系
类包含属性和方法
类是对像的模板
对象是类的事例
二、语法
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