一、属性和方法
- 类属性
- 类属性:直接在类中定义的属性
- 类属性可以通过类或类的实例访问。但是类属性只能通过类对象类修改,无法通过实例对象来修改。
class A(object):
# 类属性:直接定义在类中的属性。
# 类属性可以通过类和给类的实例来访问。
# 类中的属性只能通过类对象来修改,不能通过实例对象来修改。
count = 0
# pass
a = A()
a.count = 10
print('A', A.count)
print('a', a.count)
打印输出结果:
A 0
a 10
- 实例属性
- 实例属性:通过实例对象添加的属性属于实例属性
- 实例属性只能通过实例对象来访问修改,类对象无法访问修改。
演示1:
class A(object):
pass
a = A()
a.count = 20
# 实例属性:实例属性就是通过实例对象来添加的属性。
# 实例属性只能由实例来调用,不能由类对象来调用。
# print('A', A.count)
print('a', a.count)
打印输出结果:
a 20
演示2:
# 实例属性:self代表实例
class A(object):
# init方法里面的属性是实例属性,只能实例对象调用,这取决于self。
def __init__(self):
self.name = '周慧敏'
a = A()
# print('A', A.name)
print('a', a.name)
打印输出结果:
a 周慧敏
演示3:
class A(object):
def __init__(self):
self.name = '周慧敏'
#这个是实例方法,带self都是存储在实例中的。
# 如果类要调用实例方法,则需要传递实例进去 A.test(a)
def test(self): # self代表着实例方法
print('这是test方法')
a = A()
A.test(a)
a.test()
打印输出结果:
这是test方法
这是test方法
演示4(类方法与实例方法):
# (类方法与实例方法)装饰器方法:
class A(object):
def __init__(self):
self.name = '周慧敏'
def test(self):
print('这是test方法!')
# 类方法需要用@classmethod装饰器装饰,这个方法需要又一个cls参数,参数cls指的是类本身。
# 类方法,类可以直接调用,实例同样可以直接调用。
@classmethod
def test1(cls):
print('这是test1方法')
# 静态方法:类和实例都可以直接调用
# 静态方法不需要指定任何默认的参数,它和类本身无关。
@staticmethod
def test2():
print('这是test2方法')
a = A()
a.test1()
A.test1()
a.test2()
A.test2()
打印输出结果:
这是test1方法
这是test1方法
这是test2方法
这是test2方法
二、new魔法方法
- new魔法方法:用于创建于返回一个对象。在类准备将自身实例化时调用。
演示实例:
class Deom(object):
# int方法是初始化实例方法
def __init__(self):
print('这是init方法!')
# new方法用于创建和返回一个实例(对象)。在类准备将自身实例化时调用。
# new方法重写了object超类中的new方法
def __new__(cls, *args, **kwargs)
print('这是new方法!')
return super().__new__(cls)
# 使用super方法调用原有父类的方法。使用return返回原有父类的方法。
# new方法覆盖了原有的new方法和init方法。
# 返回原来的方法之后,就可以调用出init方法和原有的new方法。
d = Deom()
打印输出结果:
这是new方法
这是init方法
总结:
new方法就是构建出实例的作用。
- 对象创建的先后顺序:
- 通过new方法创建对象
- 并将对象返回,传给inie方法。
注意:
- new()方法用于创建对象。
- init()方法在对象创建的时候,自动调用。
- 但是此处重写了父类的__new__()方法,覆盖了父类__new__()创建对象的功能,所以对象并没有创建成功。所以仅执行__new__()方法内部代码
- 在创建对象时,一定要将对象返回,在会自动触发__init__()方法
- init()方法当中的self,实际上就是__new__返回的实例,也就是该对象
init()与__new__()区别
- __init__实例方法,__new__静态方法
- __init__在对象创建后自动调用,__new__创建对象的方法
三、单例模式
- 单例模式是一种软件设计模式,也就是该类只包含一个实例(对象)。
演示1(单例模式的引出):
在这里插入代码片class Single(object):
# pass
name = '周慧敏'
s = Single()
s1 = Single()
print(s, s1)
# 会创建很多对象占用内存。--单例模式的引出
# 单例模式作用:只需要一个实例完成一个功能,节省内存的开支。
<main.Single object at 0x0000022585237FD0> <main.Single object at 0x0000022585237FA0>
- 单例模式的创建:
'''
如何用代码实现单例模式
对象不存在时候---->创建实例
对象存在的时候---->返回已经创建的实例
'''
class Single(object):
__obj = None
def __new__(cls, *args, **kwargs):
if cls.__obj is None:
cls.__obj = super().__new__(cls)
return cls.__obj
else:
return cls.__obj
s = Single()
s1 = Single()
print(s, s1)
打印输出结果:
<main.Single object at 0x0000022585237E50>
<main.Single object at 0x0000022585237E50>
总结:
- 创建一个实例(对象)时,为none。返回new创建的新的对象。
- 第二个实例(对象)时,不为none,返回的是原有的对象。
单例模式的应用:应用在一些资源管理器中,比如日志记录等。
模块
-
模块化指将一个完整的程序分解成一个个小的模块。
-
通过模块的组合,来搭建一个完整的程序。
-
模块的特点:
- 方便维护
- 方便开发
- 模块可以服用
-
模块的创建:
- 1、首先创建一个py文件的模块
- 2、在这个py文件的模块中输出你所需要实现某种功能的代码块
- 3、右键当前文件,选择Mark Directory as中的Sources Root创建跟文件
- 4、在你需要导包的文件中完成导包
-
导包的格式:
import 模块名称 as 模块中的函数名
from 模块名称 import 模块中的类名称
from 模块名称 import *
注意:*代表导入全部
演示实例:
上述图片中test.py是创建的模块文件
第十四讲就是使用Mark Directory as中的Sources Root创建跟文件
演示实例1:
# 第一种访问方法:
import test as test1
print(test1)
# 查看访问路径。
print(test1.a, test1.b)
# 访问变量
打印输出结果:
这是我的第一个模块
<module 'test' from 'D:\\PycharmProjects\\wangjiaxin\\Python-Cheney老师基础讲解\\第十四将\\test.py'>
1 2
演示实例2:
# 第二种访问方法(访问类):
# 模式一:
from test import Person
p = Person()
print(p.name)
打印输出结果:
这是我的第一个模块
周慧敏
演示实例3:
# 模式二:
# 导入*号相当于导入全部
from test import *
p = Person()
print(p.name)
打印输出结果:
这是我的第一个模块
周慧敏
- 模块的使用:
- 访问模块中的变量语法:模块名.变量名
- 访问模块中的函数语法:模块名.函数名
- 访问模块中的对象语法:模块名.对象名
- 我们也可以引入模块中部分内容语法:from 模块名 import 变量,变量…
- 还有一种引入方式语法:from 模块名 import 变量 as 别名