巨蟒python全栈开发-第17天 核能来袭-成员
- 一.今日主要内容
- 1.成员
在类中你能写的所有内容都是类的成员
2.变量
(1)实例变量:昨天写的就是实例变量,由对象去访问的变量.
(2)类变量(静态变量):此时,这个变量属于类,但是对象也可以访问- 3.方法
(1)实例方法:昨天写的就是实例方法,使用 对象.方法() 进行调用
特点:在声明的时候,需要给出self,self必须放在第一个位置
在调用的时候,自动的会把对象传递给形参的self- (2)类方法(@classmethod):类方法是属于类的.
特点:在声明的时候需要给出一个能够接收类名的参数,cls,也必须放在参数的第一个
在调用的时候,自动的把xx对象的类传递给cls- (3) 静态方法(@staticmethod):静态方法也是属于类的,静态方法就好比,我们在类中定义了一个函数
静态方法一般和类方法差不多,使用类名去访问- 4.属性(这个是比较有用的)
#为了在难受的时候舒服一点
在方法上添加一个@property,可以把一个方法变成一个属性,但是这个属性不可以被赋值
当我们某一个属性必须经过计算才能得到结果的时候
#我的理解:本质是方法,但是可以当成属性来用
5.私有
所有已双下划綫开头的方法,变量都是私有内容,外界无法访问//除非你主动暴露这些内容
你想保护就把他私有化
#总结:强化面向对象(今天量稍微大一些)
- 二.今日内容大纲
1.实例化变量
2.实例方法
3.类变量
4.类方法
5.静态方法
6.属性
7.私有- 三.今日内容详解
- 1.实例变量
- class Person:
- def __init__(self,name,id,gender,birth):
- self.name=name #实例变量 对象里的变量
- self.id=id
- self.gender=gender
- self.birth=birth
- p=Person('wusir','','不详','1900-12-15')
- print(p.birth)
- p.birth='1840-5-6' #实例变量可以进行修改
- print(p.birth)
- #实例变量一般使用 对象.属性
- print(p.name)
- 2.实例方法
(1)
- class Computer(object):
- #实例方法
- def play(self):
- print('电脑可以扫雷')
- #在定义实例方法的时候,必须给出一个参数 self
- #形参的第一个参数,自动的把对象给传递进来
- def work(self): #self 就是个形参,随便写,中文也行
- print(self) #self 是当前类的对象
- print('电脑用来工作')
- c=Computer()
- c.work() #调用的时候不需要手动给出self
- print(c)
(2)
- 回顾之前
字符串操作. 列表操作. 字典操作. 元组操作.....
s = "你好啊"
s.replace("你", "我")
之前讲解的所有方法都是实例方法
- 3.类变量
- class Person:
- # country='中国' #类变量, 类变量是属于类的
- country = '大清' #类变量不是特别特别常用
- def __init__(self,name,gender):
- self.name=name
- self.gender=gender
- p=Person('武sir','未知')
- print(p.name) #实例变量
- print(p.gender)
- print(p.country) #类变量可以给对象使用
- p2=Person('太白','两性')
- print(p2.gender)
- print(p2.country)
- #大坑:没有修改类变量
- p.country='大清' #没有修改类变量,只是在自己的实例化空间内创建了一个country
- p2.country='大明'
- print(p.country) #类变量可以给对象使用
- print(p2.country)
- Person.country='大元' #类变量最好是使用类名来访问
- print(p.country)
- print(p2.country)
4.类方法
- class Person:
- #实例方法
- def chi(self):
- print('人会吃')
- @classmethod #装饰器,此时这个方法是一个类方法,固定方法
- def he(cls): #此时接收到的cls是类名
- print(cls)
- print('人会喝')
- #用对象访问
- p=Person()
- p.he() #解释:在调用类方法的时候. 默认的把类名传递给类方法
- #<class '__main__.Person'>
- #人会喝
- print(Person) #<class '__main__.Person'>
- # 类方法一般用类名去访问
- Person.he() # 类方法
- # Person.chi() #这句话就会报错
- # 总结:带类的最好用类来访问
5.静态方法
- class Person:
- @staticmethod #静态方法
- def yue():
- print('SKT')
- #静态方法可以使用对象访问,
- # 也可以使用类名访问,
- # 但是一般推荐使用类名访问
- p=Person()
- p.yue()
- Person.yue()
- #知识点回顾:
- #fromkeys共用value,返回新字典,不是原来的字典
6.属性
(1)引子
- #怎么解决,每过一年都要加一年,把age 替换成 birth
- class Person:
- def __init__(self,name,gender,birth):
- self.name=name
- self.gender=gender
- self.birth=birth #2000 2018
- #年龄这一项,本来就应该是算出来的,而不是直接存储的
- p1=Person('武sir','未知',2000)
- age=2018-p1.birth #每个人都有年龄这个属性,但是又没办法存储
- print(age)
(2)@property
- class Person:
- def __init__(self,name,gender,birth):
- self.name=name
- self.gender=gender
- self.birth=birth #2000 2018
- #年龄这一项,本来就应该是算出来的,而不是直接存储的
- @property #把一个方法更改成一个属性,每次拿属性的时候都会自动的去执行这个方法
- #方法的返回值就是属性值
- def age(self): #实例方法
- print('我是方法')
- return 2018-self.birth
- #注意:这里的属性是不能赋值的,方法不是变量
- p1=Person('武sir','未知',2000)
- print(p1.age) #看着像一个变量一样使用,实际上这里是调用的一个方法
- print(p1.age)
- # p1.age=99 #不可以修改的,因为age是一个方法,不是一个变量
- #这句话修改会报错
7.私有 __
- class Person:
- __qie='潘潘' #私有类变量(或者叫做私有静态变量)
- def __init__(self,name,mimi):
- self.name=name
- self.__mimi=mimi #__mimi代表的是 私有内容 实例变量
- def gaosu(self):
- print(f'把秘密告诉了太白,第二天所有人都知道了"{self.__mimi}"')
- print(Person.__qie) #私有的类变量只能在类中调用,可以用类名调用
- print(self.__qie) #私有的类变量只能在类中调用,可以用对象名调用
- def __yue(self): #私有的实例方法
- print('我要和宝宝约')
- @staticmethod
- def __koujiao():
- print('韩志远希望和嫂子一起抠脚')
- p=Person('wusir','和嫂子的故事')
- p.gaosu()
- # print(p.__mimi) #私有的内容只能在类里面调用,这里写会报错
- #除非主动暴露自己的秘密,否则,不会
- # print(Person.__qie) #这句话也会报错
- # p.__koujiao() #也会报错
- # Person.__koujiao() #也会报错
作业:
1. 简述⾯面向对象三⼤大特性并⽤用示例例解释说明?【背写】
- 封装:对属性和方法的封装,以便随时调用
- 继承:子类除了本身之外还可以使用父类的方法和属性
- 多态:鸭子模型,同一个对象拥有多种形态
2.⾯向对象中的变量分为哪几种?并用示例说明区别?【背写】
- (1)实例变量: 说白了,就是每个实例变量都应该拥有的变量,比如,人的名字,人的爱好
每个人的个人信息都属于实例变量..给对象用的- (2) 类变量(静态变量): 直接写在类中的变量就是类变量,需要用类名来访问,可以改变,多个对象共享的
3.⾯向对象中方法有哪几种?并用示例说明区别?【背写】
- 1. 类方法 类名.方法 调用
2. 实例方法 对象.方法 调用
3. 静态方法 类名.方法 调用
4.面向对象中的属性有什么?并⽤用示例例说明?
- 重点记忆(这个 没有理解好)
- (1)@property 把方法转换成属性
(2)对象.属性(self.name)
5.简述静态方法和类方法的区别?
- 记忆!!!
静态方法: 不用传递参数,没有继承
类方法: 需要传递参数,可以继承;访问类方法,默认传递的是类;
6.⾯向对象的⽅法中哪个无需传参数?
记忆!!!
静态方法
7.面向对象中公有和私有成员,在编写和调用时有哪些不同?
- 记忆!!!
- 编写,公有成员编写时,没有什么特别的要求,私有成员在成员名字前面需要加上__,双下划线,
公有成员在内部和外部都可以调用,私有成员只能在内部使用- 网友:
公有使用: __xx__ 两端使用__
私有使用__xx 左端使用
8.
- class Foo(object):
- a1=11
- a2=12
- def __init__(self):
- self.a1=1
- obj=Foo()
- print(obj.a1)
- print(obj.a2)
- 结果:
- 1
- 12
- 分析:应该先找__init__里面的实例变量信息,再找类变量信息
9.
- class Foo(object):
- a1=11
- def __init__(self,num):
- # self.a2=num
- self.a2=1
- obj=Foo(999)
- print(obj.a2)
- print(obj.a1)
- print(Foo.a1)
- # print(Foo.a2) #因为第四行里是用类调用初始化方法里的变量,自然调用不到
- #报错原因是,类中没有属性a2
- 结果:
- 999
- 11
- 11
- 第四行报错
10.
- class Foo(object):
- a1=1
- __a2=2
- a2=2
- def __init__(self,num):
- self.num=num
- self.__salary=1000
- # self.salary=1000
- def get_data(self):
- print(self.num+self.a1)
- obj=Foo(666)
- print(obj.num)
- print(obj.a1)
- # print(obj.__salary) #结果:Foo' object has no attribute '__salary'
- # print(obj.salary) #自己测试结果:1000
- # print(obj.__a2)
- # print(obj.a2) #自己测试结果:2
- print(Foo.a1) #结果:1
- print(Foo.__a2)
- # print(Foo.a2) #自己测试结果:2
- 结果:
- 666
- 1
- 找不到
- 找不到
- 1
- 找不到
11.
- # 没问题,但是做这样的题目一定要仔细
- class Foo(object):
- a1=1
- __a2=2
- def __init__(self,num):
- self.num=num
- self.__salary=1000
- def get_data(self):
- print(self.num+self.a1)
- obj1=Foo(666)
- obj2=Foo(999)
- print(obj1.num) #
- print(obj1.a1) #
- obj1.num=18
- obj1.a1=99
- print(obj1.num) #
- print(obj1.a1) #
- print(obj2.a1) #
- print(obj2.num+Foo.a1) #
- print(obj2.num+obj1.a1) #
12.
- #注意下面的四种玩法
- class Foo(object):
- hobby='大保健'
- def __init__(self,num):
- self.num=num
- self.__salary=1000
- def f1(self):
- print(Foo.hobby)
- @staticmethod
- # def f2(self):
- def f2(): #注意这个静态方法不能有self,有self不会调用
- print(Foo.hobby)
- @classmethod
- def f3(cls):
- print(cls.hobby)
- @property
- def f4(self):
- print(Foo.hobby)
- # print(self.hobby)
- f=Foo(200)
- f.f1()
- f.f2()
- f.f3()
- f.f4
13.
- class Foo(object):
- @classmethod
- def f3(cls):
- print(cls)
- Foo.f3() #结果:<class '__main__.Foo'>
14.
- class Foo(object):
- @classmethod
- def f3(cls):
- print(cls)
- obj=Foo()
- obj.f3() #结果:<class '__main__.Foo'>
15.
- #我认为是一样的
- #结果是一样的,和我推测的一样
- class Foo(object):
- @classmethod
- def f3(cls):
- print(cls)
- def f2(self):
- self.f3() #<class '__main__.Foo'>
- Foo.f3() #<class '__main__.Foo'>
- obj=Foo()
- obj.f2()
16.
- class Base(object):
- @classmethod
- def f3(cls):
- print(cls)
- def f1(self):
- print('base.f1')
- self.f3() #子类中有的话,用子类的,没有则用父类的
- class Foo(Base):
- # def f3(self):
- # print('123')
- def f2(self):
- print('foo.f2')
- self.f1()
- obj=Foo()
- obj.f2()
- #结果:
- foo.f2
- base.f1
- <class '__main__.Foo'>
17.请编写一个私有的静态方法,并通过代码证明私有方法不能再外部方法但可以在内部访问。
- #注意,我们可以在内部通过,自己的类和未私有化的方法来调用私有化的静态方法
- class Person:
- __qie='潘潘' #私有类变量
- def __init__(self,name,mimi):
- self.name=name
- self.__mimi=mimi #__mimi代表的是 私有方法
- #
- @staticmethod
- def __donggua(self):
- # def donggua(self):
- print('你好啊!')
- def gaosu(self):
- # __donggua()
- Person.__donggua(self)
- print(f'把秘密告诉了太白,第二天所有人都知道了"{self.__mimi}"')
- p=Person('wusir','和嫂子的故事')
- # print(p.__mimi) #私有的内容只能在类里面调用
- #除非主动暴露自己的秘密,否则,不会
- p.gaosu()
巨蟒python全栈开发-第17天 核能来袭-成员的更多相关文章
- 巨蟒python全栈开发-第20天 核能来袭-约束 异常处理 MD5 日志处理
一.今日主要内容 1.类的约束(对下面人的代码进行限制;项目经理的必备技能,要想走的长远) (1)写一个父类,父类中的某个方法要抛出一个异常 NotImplementedError(重点) (2)抽象 ...
- 巨蟒python全栈开发-第16天 核能来袭-初识面向对象
一.今日内容总览(上帝视角,大象自己进冰箱,控制时机) #转换思想(从面向过程到面向对象) 1.初识面向对象 面向过程: 一切以事物的发展流程为中心. 面向对象: 一切以对象为中心,一切皆为对象,具体 ...
- 巨蟒python全栈开发-第19天 核能来袭-反射
一.今日主要内容 1.isinstance,type,issubclass A.isinstance: 判断你给对象是否是xx类型的. (向上判断) B.type: 返回xxx对象的数据类型 C.is ...
- 巨蟒python全栈开发-第18天 核能来袭-类和类之间的关系
一.今日主要内容: 1.类与类之间的关系 在我们的世界中事物和事物之间总会有一些联系. 在面向对象中,类和类之间也可以产生相关的关系 (1)依赖关系 执行某个动作(方法)的时候,需要xxx来帮助你完成 ...
- 巨蟒python全栈开发linux之centos3
1.作业讲解 (1)递归创建文件夹/tmp/oldboy/python/{alex,wusir,nvshen,xiaofeng} 下面中的路径没有必要换,在哪里创建都行,根目录下或者tmp目录下或者其 ...
- 巨蟒python全栈开发linux之centos1
1.linux服务器介绍 2.linux介绍 3.linux命令学习 linux默认有一个超级用户root,就是linux的皇帝 注意:我的用户名是s18,密码是centos 我们输入密码,点击解锁( ...
- 巨蟒python全栈开发django5:组件&&CBV&FBV&&装饰器&&ORM增删改查
内容回顾: 补充反向解析 Html:{% url ‘别名’ 参数 %} Views:reverse(‘别名’,args=(参数,)) 模板渲染 变量 {{ 变量名 }} 逻辑相关 {% %} 过滤器: ...
- 巨蟒python全栈开发数据库前端6:事件onclick的两种绑定方式&&onblur和onfocus事件&&window.onload解释&&小米商城讲解
1.回顾上节内容(JavaScript) 一.JavaScript概述 1.ECMAScript和JavaScript的关系 2.ECMAScript的历史 3.JavaScript是一门前后端都可以 ...
- 巨蟒python全栈开发linux之centos6
1.nginx复习 .nginx是什么 nginx是支持反向代理,负载均衡,且可以实现web服务器的软件 在129服务器中查看,我们使用的是淘宝提供的tengine,也是一种nginx服务器 我们下载 ...
随机推荐
- Archive将多个对象归档到同一个文件
使用archiveRootObject:toFile:方法能够将一个对象直接写入到一个文件里.但有时候可能想将多个对象写入到同一个文件里,那么就要使用NSData来进行归档对象. NSData能够为一 ...
- openfireserver和jdk环境删除命令
一.卸载jdk1.8 终端依次运行以下的命令 sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin sudo rm -rf / ...
- redis windows 下安装及使用
1.下载redis https://github.com/MSOpenTech/redis 2.解压下载的文档,比如D:\devSoft\redis-2.8.19 redis-benchmark.ex ...
- ping: icmp open socket: Operation not permitted 的解决办法
ping: icmp open socket: Operation not permitted 的解决办法:为ping加上suid即可.报错时ping的属性: [root@localhost ~]# ...
- CMSGC造成内存碎片的解决方法
我们知道,CMSGC在老生代回收时产生的内存碎片会导致老生代的利用率变低:或者可能在老生代总内存大小足够的情况下,却不能容纳新生代的晋升行为(由于没有连续的内存空间可用),导致触发FullGC.针对这 ...
- 跟着百度学PHP[14]-PDO的预处理语句1
预处理语句有以下两个特点: 1.效率高 2.安全性好 为什么说预处理语句效率高呢? 预处理语句就好比一个模板,比如下面的一串插入语句: insert into admin(id,username,pa ...
- 如何使用UltraISO将制作的ios文件挂载到虚拟机上面
选中要挂载的文件例如图中蓝色的部分移动到上面,然后点击文件中的保存按钮就可以了. 接下来设置虚拟机上的red hat6.3 记住一定要把红色部分选中,才能在虚拟机上看到 然后点击光盘就可以看到挂载的内 ...
- apply 判定变量类型
js 数据类型 6大类:object ,undefined,boolean,string,number,null,但是有时候我们经常要更准确的判断,比如,是数组,还是单例... 那么就用apply吧, ...
- 为什么43%前端开发者想学Vue.js
根据JavaScript 2017前端库状况调查 Vue.js是开发者最想学的前端库.我在这里说明一下我为什么认为这也是和你一起通过使用Vue构建一个简单的App应用程序的原因. 我最近曾与Evan ...
- java.lang.IllegalArgumentException: SessionContext must be an HTTP compatible implementation.:模块化本地测试shiro的一些总结
项目由于是多模块的,所以,测试的时候我想现将shiro框架进行本地测试,然后再放入框架里面,但是这个困扰我了两天了都,其实我应该想到的,只是想多试试,最后还不如多想想 先说一下系统的基本情况,项目是多 ...