Django基础04-day19

写在前面




上课第19天,打卡:

    忠于你的理想,别想生活妥协,让挣扎变得有意义!



################
# 2017-09-03 - 课上笔记
################

class day19:
	def __init__():
		pass

	def do_homework():
		pass

	def do_my_project():
		pass

‘‘‘Django 回顾‘‘‘

	- http请求周期
		浏览器(socket客户端)
			2.socket.connect(ip,port) 进行连接
			3.socket.send("http://www.qq.com/index.html...")    url + data
				遵循的规则:http协议
					请求头
					请求体

请求头和请求体使用 ‘\r\n\r\n‘ 分隔,前面是请求头,后面是请求体
GET请求: "GET /index.html?key=1... Http/1.1\r\nhost:www.qq.com\r\ncontent-type:application/json\r\n\r\n"

POST请求:"POST /index.html Http/1.1\r\nhost:www.qq.com\r\ncontent-type:application/json\r\n\r\nname=alex&pwd=123"

			6.获取响应
				响应头,响应体 = data.split("\r\n\r\n")

				响应头之间用 ‘\r\n‘ 分隔

			7.断开连接

		nginx(socket服务端)
			1.server.run(),监听IP和PORT
			4.server.recv()

				请求头,请求体 = data.split("\r\n\r\n")
				request.POST.get(‘name‘)  即是从 请求体 里取值
			5.服务端进行响应:
				conn.send(‘......‘)
				遵循的规则:http协议
					响应头
					响应体

			7.断开连接

	总结:
		a.Http请求中本质都是字符串
		b.Http请求是短连接(请求 -> 响应 -> 断开连接)
		c.请求和响应都有头和体
			请求:请求头‘\r\n\r\n‘请求体
			响应:响应头‘\r\n\r\n‘响应体

由于需要处理繁琐http的解析和封装处理工作,所以web框架应运而生

web框架
	- Django
		socket(wsgiref)   django没有自己写socket
		解析和封装http请求

	django-admin startproject mysite

	cd mysite
	python manage.py startapp app01

	coding...(*****)

	python manage.py runserver ip:port

‘‘‘写代码‘‘‘

	- 路由系统
		/login/   			func   	name=‘f1‘
		/login/\d+/ 		func	name=‘f2‘
		/login/(?P<n>\d+)/	func	name=‘f3‘
		/login/\d+/			include(‘app01.urls‘)

	- 视图函数
		def index(request):

			request.GET
			request.body	    原生的请求体
			request.POST        转换后的请求体字典   如果请求头中content-type=urlencode-form... 才将request.body转换成字典
				- 可能有值
				- 也可能没有值
			request.method
			request.Meta

			request.GET.get()
			request.GET.getlist()        前端多选的情况,如多个作者
			request.POST.get()
			request.POST.getlist()

			return HttpResponse(‘字符串/字节‘)
			return render(request,"html路径",locals())
			return redirect("url")

	- 模板
		for if

		继承

		filter,simple_tag

	- Models操作
		- 创建表
		- models.xxx.objects.create(name="xxxx")
		- models.xxx.objects.create(**dic)
		- models.xxx.objects.filter(id__gt=1).delete()
		- models.xxx.objects.filter(id=1)
		- models.xxx.objects.exclude(id=5)     取出id不等于5的
		- models.xxx.objects.filter(id=1).update(name=‘ddd‘)
		- models.xxx.objects.filter(id=1).update(**dic)

		queryset --> [对象,对象...]
		objs = models.xxx.objects.all()

		queryset --> [{},{}...]
		objs = models.xxx.objects.all().values()

		queryset --> [(),()...]
		objs = models.xxx.objects.all().values_list()

demo1
	业务线表  bussiness_unit
		id name
	主机表 serverinfo
		id host port bs(业务线对象)

	objs = modesl.serverinfo.objects.all()
	for row in objs:
		print(row.id)
		print(row.host)
		print(row.port)
		print(row.bs.name)   外键,拿到业务线的名字

	objs = modesl.serverinfo.objects.all().values("id","host","port","bs__name")
	for row in objs:
		print(row[‘host‘])
		print(row[‘bs__name‘])

demo2 (userinfo 和 bussiness_unit 是多对多关系)
	用户表 userinfo
		id user pwd email mm(ManyToMany)
	业务线表  bussiness_unit
		id name
	主机表
		id host port bs(业务线对象)
	用户业务线关系表  *****
		id user_id bs_id

	obj = models.user.objects.filter(user=‘alex‘).first()
	obj.mm.add(1)
	obj.mm.add(11)

	- 通过用户对象查所负责的所有业务线对象
	obj = models.user.objects.filter(user=‘alex‘).first()
	queryset = obj.mm.all()          拿到alex负责的所有业务线  -> [业务线对象,业务线对象...]
	for row in queryset:
		print(row.id)
		print(row.name)

	- 通过业务线反查对应有哪些人负责? (***反查***    表名_set)
	obj = models.bussiness_unit.objects.filter(name=‘二手车‘).first()
	queryset = obj.userinfo_set.all()   拿到负责二手车业务线的用户对象  ->  [用户对象,用户对象...]
	for row in queryset:
		print(row.user)
		print(row.pwd)

总结:
	1.多对多关系建在哪张表上都可以;
	2.如果建在userinfo表上,那么通过用户对象查所负责的bs对象列表就直接用 obj.mm.all()
	方便了 userinfo对象,但是bs对象反查userinfo就得用 userinfi_set.all()

==================================================================

今日内容:

1.登录
	- 密码加密,对密码进行比较
	- 用户登录之后才能访问某些页面

2.cookie是什么?
	- 保存在客户端浏览器上的键值对 {k:v}
	- cookie依附在请求头或者响应头中
	- 浏览器发送请求时会自动携带所访问网站对应的cookie
	- 应用
		- 实现登录
		- 投票
		- 每页显示10条/20条...

	- 使用
		- 设置
			response =  redirect(‘/index/‘)
            response.set_cookie(‘my_cookie‘,md5.encrypt(‘xxx‘))
            return response

key,
value=‘‘,
max_age=None,		超时时间:秒数
expires=None, 		超时时间:截止日期
path=‘/‘,			cookie在哪个url里生效 :  访问指定url时才能读取到cookie,   ‘/‘  表示全部页面都可以
domain=None, 		当前域名或者二级域名
secure=False, 		https
httponly=False  	

response = redirect(‘/index/‘)
# 设置cookie
response.set_cookie(‘my_cookie‘,md5.encrypt(user))
return response
# 设置cookie过期时间
import datetime
deadline = datetime.datetime.utcnow() + datetime.timedelta(seconds=5)
response.set_cookie(‘my_cookie‘,md5.encrypt(user),expires=deadline)
response.set_cookie(‘my_cookie‘,md5.encrypt(user),max_age=5)

        - 获取
            ck = request.COOKIES.get(‘my_cookie‘)

# 详细代码如下:
‘‘‘
# models.py

from django.db import models

# Create your models here.

class UserInfo(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    email = models.EmailField(null=True)

‘‘‘    

‘‘‘
from django.shortcuts import render,HttpResponse,redirect
from app01 import models
from common import md5

# 判断用户是否登录的装饰器(通过cookie判断)
def auth(func):
    def inner(request,*args,**kwargs):
        ck = request.COOKIES.get(‘my_cookie‘)
        if not ck:
            return redirect(‘/login/‘)
        return func(request,*args,**kwargs)
    return inner

@auth
def index(request):
    user = request.COOKIES.get(‘my_cookie‘)
    print(request.COOKIES)
    # return HttpResponse("登录成功")
    return render(request,‘index.html‘,locals())

def login(request):
    if "GET" == request.method:
        return render(request,‘login.html‘)
    else:
        user = request.POST.get(‘user‘)
        pwd = request.POST.get(‘pwd‘)
        obj = models.UserInfo.objects.filter(username=user,password=md5.encrypt(pwd)).first()
        if obj:

            response = redirect(‘/index/‘)
            # 设置cookie过期时间
            # import datetime
            # deadline = datetime.datetime.utcnow() + datetime.timedelta(seconds=5)
            # response.set_cookie(‘my_cookie‘,md5.encrypt(user),expires=deadline)
            # response.set_cookie(‘my_cookie‘,md5.encrypt(user),max_age=5)

            # 设置cookie
            response.set_cookie(‘my_cookie‘,user)
            return response
        else:
            return render(request,‘login.html‘,{‘msg‘:"用户名或密码错误"})
‘‘‘

‘‘‘
# login.html

...
<form action="/login/" method="POST">
    {% csrf_token %}
    <input type="text" name="user">
    <input type="text" name="pwd">
    <input type="submit" value="提交"><span style="color: red;">{{ msg }}</span>
</form>
...

# index.html
...
<h1>{{ user }}</h1>
...
‘‘‘
‘‘‘
# md5.py

def encrypt(pwd):
    import hashlib
    obj = hashlib.md5()
    obj.update(pwd.encode(‘utf-8‘))
    data = obj.hexdigest()
    return data

if __name__ == ‘__main__‘:
    print(encrypt(‘123‘))
‘‘‘

3.session

	是保存在服务器端的键值对 {k:v}

	依赖cookie

	Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
	更多参考:http://www.cnblogs.com/wupeiqi/articles/5246483.html

	生成随机字符串,并将其当做cookie发送给客户端
	服务端设置随机字符串作为key,自己设置一些{}:request.session[‘my_session_key‘] = user

	- 设置session
        request.session[‘yyy‘] = user
        return redirect(‘/index/‘)

    - 获取session
    	# 装饰器
		def auth(func):
		    def inner(request,*args,**kwargs):
		        ck = request.session.get(‘yyy‘)
		        if not ck:
		            return redirect(‘/login/‘)
		        return func(request,*args,**kwargs)
		    return inner

    - 清空session
    	request.session.clear()

http://www.cnblogs.com/wupeiqi/articles/5246483.html

SESSION_ENGINE = ‘django.contrib.sessions.backends.db‘  # 引擎(默认)
SESSION_COOKIE_NAME = "sessionid"        # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/"                # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None             # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False            # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True           # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600             # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False       # 是否每次请求都保存Session,默认修改之后才保存(默认)

# 详细代码如下:
‘‘‘
from django.shortcuts import render,HttpResponse,redirect
from app01 import models
from common import md5

# 判断用户是否登录的装饰器(通过session判断)
def auth(func):
    def inner(request,*args,**kwargs):
        ck = request.session.get(‘my_session_key‘)
        if not ck:
            return redirect(‘/login/‘)
        return func(request,*args,**kwargs)
    return inner

@auth
def index(request):
    user = request.session.get(‘my_session_key‘)
    return render(request,‘index.html‘,locals())

@auth
def order(request):
    return render(request,‘order.html‘)

# 登出view
def logout(request):
	# 用户登出后清空session
    request.session.clear()
    return redirect(‘/index/‘)

def login(request):
if "GET" == request.method:
    return render(request,‘login.html‘)
else:
    user = request.POST.get(‘user‘)
    pwd = request.POST.get(‘pwd‘)
    obj = models.UserInfo.objects.filter(username=user,password=md5.encrypt(pwd)).first()
    if obj:
        # 设置session
        request.session[‘my_session_key‘] = user
        return redirect(‘/index/‘)
    else:
        return render(request,‘login.html‘,{‘msg‘:"用户名或密码错误"})
‘‘‘

‘‘‘
# urls.py

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r‘^admin/‘, admin.site.urls),
    url(r‘^login/‘, views.login),
    url(r‘^logout/‘, views.logout),
    url(r‘^index/‘, views.index),
    url(r‘^order/‘, views.order),
]
‘‘‘

‘‘‘
# login.html

...
<form action="/login/" method="POST">
    {% csrf_token %}
    <input type="text" name="user">
    <input type="text" name="pwd">
    <input type="submit" value="提交"><span style="color: red;">{{ msg }}</span>
</form>
...

# index.html
...
<h1>{{ user }}</h1>
...

# order.html
...
<body>
<h1>欢迎登录:{{ request.session.my_session_key }}</h1>
<a href="/logout/">注销</a>
</body>
...
‘‘‘

4.csrf 跨站请求伪造

<form action="/login/" method="POST">
    {% csrf_token %}
    <input type="text" name="user">
    <input type="text" name="pwd">
    <input type="submit" value="提交"><span style="color: red;">{{ msg }}</span>
</form>

{% csrf_token %}  在浏览器里默认就是一个隐藏的input标签,如下所示:

<form action="/login/" method="POST">
    <input type=‘hidden‘ name=‘csrfmiddlewaretoken‘ value=‘T2Ub1TacecIsEsKJvoUvB3xNSwrEGT0NajwGeO6y58mp1IseYVLL3FBnXtOT3WgW‘ />
    <input type="text" name="user">
    <input type="text" name="pwd">
    <input type="submit" value="提交"><span style="color: red;"></span>
</form>

而 {{ csrf_token }} 这个就是这个隐藏标签的value值

跨站请求的漏洞:
<form method="POST" action="http://www.icbc.com.cn/icbc/">
	<input type="text" name="from" style="display: none;" value="A的卡号">
	<input type="text" name="to" style="display: none;" value="黑客的卡号">
	<input type="text" name="money" style="display: none;" value="1000000000">
	<input type="submit" name="" value="点我">
</form>

{% csrf_token %}

# 首先不提交 csrf_token 的情况:报错403,CSRF verification failed. Request aborted.
<form id="my_form" action="/login/" method="POST">
    <input type="text" name="user">
    <input type="email" name="email">
    <button onclick="ajaxSubmit()">Ajax提交</button>
</form>
<script src="{% static "js/bootstrap.min.js" %}"></script>
<script>
    function ajaxSubmit() {
        $.ajax({
            url:‘/show/‘,
            type:‘POST‘,
            data:{
                ‘user‘:$(‘#my_form input[name="user"]‘).val(),
                ‘email‘:$(‘#my_form input[name="email"]‘).val()
            },
            success:function (data) {
                console.log(data);
            }
        })
    }
</script>

# 注意一点:
# 如果form表单不写action,则默认提交到当前页面

ajax提交csrf_token的几种方式:

# 方式1
<form id="my_form" action="/show/" method="post">
    {% csrf_token %}
    <input type="text" name="user">
    <input type="email" name="email">
    <button onclick="ajaxSubmit()">Ajax提交</button>
</form>
<script src="{% static "js/bootstrap.min.js" %}"></script>
<script>
    function ajaxSubmit() {
        $.ajax({
            url:‘/show/‘,
            type:‘POST‘,
            data:{
                ‘user‘:$(‘#my_form input[name="user"]‘).val(),
                ‘email‘:$(‘#my_form input[name="email"]‘).val(),
                ‘csrfmiddlewaretoken‘:$(‘input[name="csrfmiddlewaretoken"]‘).val()
            },
            success:function (data) {
                console.log(data)
            }
        })
    }
</script>

# 方式2   只能写在模板里
<body>
<form id="my_form" action="/show/" method="post">
    {% csrf_token %}
    <input type="text" name="user">
    <input type="email" name="email">
    <button onclick="ajaxSubmit()">Ajax提交</button>
</form>
<script src="{% static "js/bootstrap.min.js" %}"></script>
<script>
    function ajaxSubmit() {
        $.ajaxSetup({
            data: {‘csrfmiddlewaretoken‘:‘{{ csrf_token }}‘}
        });
        $.ajax({
            url:‘/show/‘,
            type:‘POST‘,
            data:{
                ‘user‘:$(‘#my_form input[name="user"]‘).val(),
                ‘email‘:$(‘#my_form input[name="email"]‘).val()
            },
            success:function (data) {
{#                do something...#}
            }
        })
    }
</script>
</body>

# 后端得到的数据:
	类型:<class ‘django.http.request.QueryDict‘>
	数据:<QueryDict: {‘csrfmiddlewaretoken‘: [‘raZNrc77aQn7cr5Wr6gtTgOaTdNWZKF0HmAfN6kqlGzmyrr4Dw7DUcSVQ6ZHcFoQ‘], ‘email‘: [‘[email protected]
	om‘], ‘user‘: [‘borui‘]}>

# 方式3   只能写在模板里
<form id="my_form" action="/show/" method="post">
    {% csrf_token %}
    <input type="text" name="user">
    <input type="email" name="email">
    <button onclick="ajaxSubmit()">Ajax提交</button>
</form>
<script src="{% static "js/bootstrap.min.js" %}"></script>
<script>
    function ajaxSubmit() {
        $.ajax({
            url:‘/show/‘,
            type:‘POST‘,
            data:{
                ‘user‘:$(‘#my_form input[name="user"]‘).val(),
                ‘email‘:$(‘#my_form input[name="email"]‘).val(),
                ‘csrfmiddlewaretoken‘:"{{ csrf_token }}"
            },
            success:function (data) {
{#                do something...#}
            }
        })
    }
</script>

这种方法,循环form表单,把很多input值拿出来组成字典,
然而实际上POST请求最后是需要转换成字符串放到请求体中发给后端的,实际上的字符串如下:
‘csrfmiddlewaretoken=ouyWxV86TJWMttyLwzRkORIcqXjInlDREG9oTPlp4z81PtUTIZIuPNMXnQvtAgmH&user=love&email=love%40qq.com‘

所以,如果ajax里的data字段如果写成一个字典,那么就需要一个转成字符串的过程;
如果直接写成字符串,也是可以的;
$(‘#my_form‘).serialize()  这个方法就可以把form表单里所有的值(包含隐藏的csrf标签)拼接成一个字符串;

# 方法4:
<form id="my_form" action="/show/" method="post">
    {% csrf_token %}
    <input type="text" name="user">
    <input type="email" name="email">
    <button onclick="ajaxSubmit()">Ajax提交</button>
</form>
<script src="{% static "js/bootstrap.min.js" %}"></script>
<script>
    function ajaxSubmit() {
        $.ajax({
            url:‘/show/‘,
            type:‘POST‘,
            data:$(‘#my_form‘).serialize(),
            success:function (data) {
                console.log(data)
            }
        })
    }
</script>

‘‘‘ 以上4中方法都是把csrf_token放入 请求体 里传递给后端 ‘‘‘

# 方法5   把csrftoken对应的值方到 请求头 里,传递给后端,这样也可以通过csrf验证
	首先引入 jquery.cookie.js 插件
	然后通过 $.cookie(‘csrftoken‘) 则可以获取到csrftoken对应的值

这种方法,是把csrftoken对应的值放到请求头里,必须按照这个格式:headers:{‘X-CSRFToken‘: $.cookie(‘csrftoken‘)}
这种情况,请求体的内容可以随便写;

<form id="my_form" action="/show/" method="post">
    {% csrf_token %}
    <input type="text" name="user">
    <input type="email" name="email">
    <button onclick="ajaxSubmit()">Ajax提交</button>
</form>
<script src="{% static "js/jquery-3.2.1.min.js" %}"></script>
<script src="{% static "js/jquery.cookie.js" %}"></script>
<script src="{% static "js/bootstrap.js" %}"></script>

<script>
    function ajaxSubmit() {
        $.ajax({
            url:‘/show/‘,
            type:‘POST‘,
            data:{‘k1‘:‘v1‘,‘k2‘:‘v2‘},
            headers:{‘X-CSRFToken‘: $.cookie(‘csrftoken‘)},
            success:function (data) {
                console.log(data)
            }
        })
    }
</script>

总结:
	基于ajax提交form表单,发送csrf验证的方式里
	最常用的就是 data:$(‘#my_form‘).serialize() 和 headers:{‘X-CSRFToken‘: $.cookie(‘csrftoken‘)}

另外:
	关于csrf有两个装饰器:from django.views.decorators.csrf import csrf_exempt,csrf_protect
	‘django.middleware.csrf.CsrfViewMiddleware‘,
	# 开启则表示全站都使用csrf验证,而csrf_exempt这个装饰器则表示哪些view可以不使用csrf
	# 如果不开启,则表示全站都不使用csrf验证,而csrf_protect这个装饰器则表示哪些view可以使用csrf

  

# 自定义分页模块

request.path_info

  

时间: 2024-08-05 07:08:01

Django基础04-day19的相关文章

Python Day19-20(Django基础)

一.Django基础 1.基本配置补充 可以用pycharm一键创建工程和APP 其他常用命令: python manage.py runserver 1.1.1.1:8000 python manage.py startapp appname python manage.py syncdb python manage.py makemigrations python manage.py migrate python manage.py createsuperuser 数据库配置 setting

Django 基础教程

Django 基础教程 这是第一篇 Django 简介 ?  Django 是由 Python 开发的一个免费的开源网站框架,可以用于快速搭建高性能,优雅的网站! 你一定可以学会,Django 很简单!本教程一直在更新,从开始写到现在大概写了一年多了,现在也一直在坚持写,每一篇教程都可能随时更新,可以在网站首页看到最近更新的情况. 我阅读学习了全部的 Django英文的官方文档,觉得国内比较好的Django学习资源不多,所以决定写自己的教程.本教程开始写的时候是 Django 的版本是 1.6,

Python之路-(js正则表达式、前端页面的模板套用、Django基础)

js正则表达式 前端页面的模板套用 Django基础 js正则表达式: 1.定义正则表达式 /.../  用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m 表示多行匹配 登录注册验证: test: 判断字符串是否符合规定的规则 rep = /\d+/;   (定义规则) rep.test('')   (引号里面必须包含字母和数字才返回true,否则为false) rep = /^\d+$/; (只有是纯数字时候才返回true,否则是false) exe

Linux命令工具基础04 磁盘管理

Linux命令工具基础04 磁盘管理 日程磁盘管理中,我们最常用的有查看当前磁盘使用情况,查看当前目录所占大小,以及打包压缩与解压缩: 查看磁盘空间 查看磁盘空间利用大小 df -h -h: human缩写,以人类易读方式显示结果(既带单位:比如M/G,如果不加这个参数,显示的数字以B为单位) $df -h /opt/app/todeav/config#df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup00-

Django[基础知识]

Python功能最全的WEB框架:Django,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. 使用Django需进行以下操作: 1.创建Django项目,创建方式有两种. a.命令操作: django-admin startproject  dg_web   //dg_web为项目名称 b.直接在开发环境IDE下进行新建django项目 创建项目之后的文件目录如下: 2.在创建的项目下建立功能程序,操作如下: 命令行:python manage.py startap

OC基础 04

OC 基础04 [email protected]基本概念 >[email protected]是编译器的指令 >[email protected] 用在声明文件中告诉编译器声明成员变量的的访问器(getter/setter)方法 这样的好处是:免去我们手工书写getter和setter方法繁琐的代码 @property基本使用 1.在@inteface中,用来自动生成setter和getter的声明 示例: 用@property int age; // 就可以代替下面的两行 - (int)a

SQL Server 基础 04 函数与分组查询数据

函数与分组查询数据 系统函数分 聚合函数.数据类型转换函数.日期函数.数学函数 . . . 1. 聚合函数 主要是对一组值进行计算,然后返回一个值. 聚合函数包括 sum(求和).avg(求平均值).min().max().count(求数量) sum函数语法  :  sum(列明) select sum(sno) as 序号和 from stu_info avg select avg(sno) as 序号平均值 from stu_info . . . count 用来一组值的个数,统计 sel

Django基础和基本使用

Django基础 Django是Python下的一款著名的Web框架 框架 任何语言进入到高级部分时,会有认证.session.http.连接数据库等等功能操作,没有框架时需要自己实现 框架 是整个或部分系统的可重用设计,表现为一组抽象组件及组件实例间交互的方法: Django优点 自带轮子众多,方便快速开发 如Auth,Cache,模板等 天生的MVC设计模块 实用的后台管理 自带ORM,Template,Form,Auth核心组件 简洁的url设计 周边插件丰富 Django缺点 重 同步阻

Java基础04 封装与接口(转载)

数据成员和方法都是同时开放给内部和外部的.在对象内部,我们利用this来调用对象的数据成员和方法.在对象外部,比如当我们在另一个类中调用对象的时,可以使用 对象.数据成员 和 对象.方法() 来调用对象的数据成员和方法. 我们将要封装(encapsulation)对象的成员(成员包括数据成员和方法),从而只允许从外部调用部分的成员.利用封装,我们可以提高对象的易用性和安全性. 封装与接口 封装(encapsulation)是计算机常见的术语,即保留有限的外部接口(interface),隐藏具体实

python基础04 运算

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Python的运算符和其他语言类似 (我们暂时只了解这些运算符的基本用法,方便我们展开后面的内容,高级应用暂时不介绍) 数学运算 >>>print 1+9        # 加法 >>>print 1.3-4      # 减法 >>>print 3*5        # 乘法 >>>print 4.5/1.5