1. 一.今日主要内容
  1. 1.成员
    在类中你能写的所有内容都是类的成员
    2.变量
    (1)实例变量:昨天写的就是实例变量,由对象去访问的变量.
    (2)类变量(静态变量):此时,这个变量属于类,但是对象也可以访问
  2.  
  3. 3.方法
    (1)实例方法:昨天写的就是实例方法,使用 对象.方法() 进行调用
    特点:在声明的时候,需要给出self,self必须放在第一个位置
    在调用的时候,自动的会把对象传递给形参的self
  4.  
  5. (2)类方法(@classmethod):类方法是属于类的.
    特点:在声明的时候需要给出一个能够接收类名的参数,cls,也必须放在参数的第一个
    在调用的时候,自动的把xx对象的类传递给cls
  6.  
  7. (3) 静态方法(@staticmethod):静态方法也是属于类的,静态方法就好比,我们在类中定义了一个函数
    静态方法一般和类方法差不多,使用类名去访问
  8.  
  9. 4.属性(这个是比较有用的)
    #为了在难受的时候舒服一点
    在方法上添加一个@property,可以把一个方法变成一个属性,但是这个属性不可以被赋值
    当我们某一个属性必须经过计算才能得到结果的时候
    #我的理解:本质是方法,但是可以当成属性来用
    5.私有
    所有已双下划綫开头的方法,变量都是私有内容,外界无法访问//除非你主动暴露这些内容
    你想保护就把他私有化
    #总结:强化面向对象(今天量稍微大一些)
  1. 二.今日内容大纲
    1.实例化变量
    2.实例方法
    3.类变量
    4.类方法
    5.静态方法
    6.属性
    7.私有
  2.  
  3. 三.今日内容详解
  1. 1.实例变量
  1. class Person:
  2. def __init__(self,name,id,gender,birth):
  3. self.name=name #实例变量 对象里的变量
  4. self.id=id
  5. self.gender=gender
  6. self.birth=birth
  7.  
  8. p=Person('wusir','','不详','1900-12-15')
  9.  
  10. print(p.birth)
  11. p.birth='1840-5-6' #实例变量可以进行修改
  12. print(p.birth)
  13.  
  14. #实例变量一般使用 对象.属性
  15.  
  16. print(p.name)
  1. 2.实例方法
    (1)
  1. class Computer(object):
  2. #实例方法
  3. def play(self):
  4. print('电脑可以扫雷')
  5.  
  6. #在定义实例方法的时候,必须给出一个参数 self
  7. #形参的第一个参数,自动的把对象给传递进来
  8. def work(self): #self 就是个形参,随便写,中文也行
  9. print(self) #self 是当前类的对象
  10. print('电脑用来工作')
  11.  
  12. c=Computer()
  13. c.work() #调用的时候不需要手动给出self
  14. print(c)

(2)

  1. 回顾之前
    字符串操作. 列表操作. 字典操作. 元组操作.....
    s = "你好啊"
    s.replace("你", "我")
    之前讲解的所有方法都是实例方法
  1. 3.类变量
  1. class Person:
  2. # country='中国' #类变量, 类变量是属于类的
  3. country = '大清' #类变量不是特别特别常用
  4. def __init__(self,name,gender):
  5. self.name=name
  6. self.gender=gender
  7.  
  8. p=Person('武sir','未知')
  9. print(p.name) #实例变量
  10. print(p.gender)
  11. print(p.country) #类变量可以给对象使用
  12.  
  13. p2=Person('太白','两性')
  14. print(p2.gender)
  15. print(p2.country)
  16.  
  17. #大坑:没有修改类变量
  18. p.country='大清' #没有修改类变量,只是在自己的实例化空间内创建了一个country
  19. p2.country='大明'
  20. print(p.country) #类变量可以给对象使用
  21. print(p2.country)
  22.  
  23. Person.country='大元' #类变量最好是使用类名来访问
  24. print(p.country)
  25. print(p2.country)

4.类方法

  1. class Person:
  2. #实例方法
  3. def chi(self):
  4. print('人会吃')
  5.  
  6. @classmethod #装饰器,此时这个方法是一个类方法,固定方法
  7. def he(cls): #此时接收到的cls是类名
  8. print(cls)
  9. print('人会喝')
  10. #用对象访问
  11. p=Person()
  12. p.he() #解释:在调用类方法的时候. 默认的把类名传递给类方法
  13. #<class '__main__.Person'>
  14. #人会喝
  15. print(Person) #<class '__main__.Person'>
  16.  
  17. # 类方法一般用类名去访问
  18. Person.he() # 类方法
  19.  
  20. # Person.chi() #这句话就会报错
  21.  
  22. # 总结:带类的最好用类来访问

5.静态方法

  1. class Person:
  2.  
  3. @staticmethod #静态方法
  4. def yue():
  5. print('SKT')
  6.  
  7. #静态方法可以使用对象访问,
  8. # 也可以使用类名访问,
  9. # 但是一般推荐使用类名访问
  10.  
  11. p=Person()
  12. p.yue()
  13.  
  14. Person.yue()
  15. #知识点回顾:
  16. #fromkeys共用value,返回新字典,不是原来的字典

6.属性

(1)引子

  1. #怎么解决,每过一年都要加一年,把age 替换成 birth
  2. class Person:
  3. def __init__(self,name,gender,birth):
  4. self.name=name
  5. self.gender=gender
  6. self.birth=birth #2000 2018
  7. #年龄这一项,本来就应该是算出来的,而不是直接存储的
  8. p1=Person('武sir','未知',2000)
  9. age=2018-p1.birth #每个人都有年龄这个属性,但是又没办法存储
  10. print(age)

(2)@property

  1. class Person:
  2. def __init__(self,name,gender,birth):
  3. self.name=name
  4. self.gender=gender
  5. self.birth=birth #2000 2018
  6. #年龄这一项,本来就应该是算出来的,而不是直接存储的
  7. @property #把一个方法更改成一个属性,每次拿属性的时候都会自动的去执行这个方法
  8. #方法的返回值就是属性值
  9. def age(self): #实例方法
  10. print('我是方法')
  11. return 2018-self.birth
  12. #注意:这里的属性是不能赋值的,方法不是变量
  13. p1=Person('武sir','未知',2000)
  14. print(p1.age) #看着像一个变量一样使用,实际上这里是调用的一个方法
  15. print(p1.age)
  16.  
  17. # p1.age=99 #不可以修改的,因为age是一个方法,不是一个变量
  18. #这句话修改会报错

7.私有     __

  1. class Person:
  2. __qie='潘潘' #私有类变量(或者叫做私有静态变量)
  3. def __init__(self,name,mimi):
  4. self.name=name
  5. self.__mimi=mimi #__mimi代表的是 私有内容 实例变量
  6. def gaosu(self):
  7. print(f'把秘密告诉了太白,第二天所有人都知道了"{self.__mimi}"')
  8. print(Person.__qie) #私有的类变量只能在类中调用,可以用类名调用
  9. print(self.__qie) #私有的类变量只能在类中调用,可以用对象名调用
  10.  
  11. def __yue(self): #私有的实例方法
  12. print('我要和宝宝约')
  13.  
  14. @staticmethod
  15. def __koujiao():
  16. print('韩志远希望和嫂子一起抠脚')
  17.  
  18. p=Person('wusir','和嫂子的故事')
  19. p.gaosu()
  20.  
  21. # print(p.__mimi) #私有的内容只能在类里面调用,这里写会报错
  22. #除非主动暴露自己的秘密,否则,不会
  23. # print(Person.__qie) #这句话也会报错
  24. # p.__koujiao() #也会报错
  25. # Person.__koujiao() #也会报错

作业:

1. 简述⾯面向对象三⼤大特性并⽤用示例例解释说明?【背写】

  1. 封装:对属性和方法的封装,以便随时调用
  2.  
  3. 继承:子类除了本身之外还可以使用父类的方法和属性
  4.  
  5. 多态:鸭子模型,同一个对象拥有多种形态

2.⾯向对象中的变量分为哪几种?并用示例说明区别?【背写】

  1. (1)实例变量: 说白了,就是每个实例变量都应该拥有的变量,比如,人的名字,人的爱好
    每个人的个人信息都属于实例变量..给对象用的
  2.  
  3. (2) 类变量(静态变量): 直接写在类中的变量就是类变量,需要用类名来访问,可以改变,多个对象共享的

3.⾯向对象中方法有哪几种?并用示例说明区别?【背写】

  1. 1. 类方法 类名.方法 调用
    2. 实例方法 对象.方法 调用
    3. 静态方法 类名.方法 调用

4.面向对象中的属性有什么?并⽤用示例例说明?

  1. 重点记忆(这个 没有理解好)
  2.  
  3. (1)@property 把方法转换成属性
    (2)对象.属性(self.name)

5.简述静态方法和类方法的区别?

  1. 记忆!!!
    静态方法: 不用传递参数,没有继承
    类方法: 需要传递参数,可以继承;访问类方法,默认传递的是类;

6.⾯向对象的⽅法中哪个无需传参数?

记忆!!!

静态方法

7.面向对象中公有和私有成员,在编写和调用时有哪些不同?

  1. 记忆!!!
  2.  
  3. 编写,公有成员编写时,没有什么特别的要求,私有成员在成员名字前面需要加上__,双下划线,
    公有成员在内部和外部都可以调用,私有成员只能在内部使用
  4.  
  5. 网友:
    公有使用: __xx__ 两端使用__
    私有使用__xx 左端使用

8.

  1. class Foo(object):
  2. a1=11
  3. a2=12
  4. def __init__(self):
  5. self.a1=1
  6. obj=Foo()
  7. print(obj.a1)
  8. print(obj.a2)
  9.  
  10. 结果:
  11. 1
  12. 12
  13. 分析:应该先找__init__里面的实例变量信息,再找类变量信息

9.

  1. class Foo(object):
  2. a1=11
  3.  
  4. def __init__(self,num):
  5. # self.a2=num
  6. self.a2=1
  7. obj=Foo(999)
  8. print(obj.a2)
  9. print(obj.a1)
  10.  
  11. print(Foo.a1)
  12. # print(Foo.a2) #因为第四行里是用类调用初始化方法里的变量,自然调用不到
  13. #报错原因是,类中没有属性a2
  14.  
  15. 结果:
  16. 999
  17. 11
  18. 11
  19. 第四行报错

10.

  1. class Foo(object):
  2. a1=1
  3. __a2=2
  4. a2=2
  5.  
  6. def __init__(self,num):
  7. self.num=num
  8. self.__salary=1000
  9. # self.salary=1000
  10. def get_data(self):
  11. print(self.num+self.a1)
  12. obj=Foo(666)
  13. print(obj.num)
  14. print(obj.a1)
  15. # print(obj.__salary) #结果:Foo' object has no attribute '__salary'
  16. # print(obj.salary) #自己测试结果:1000
  17. # print(obj.__a2)
  18. # print(obj.a2) #自己测试结果:2
  19. print(Foo.a1) #结果:1
  20. print(Foo.__a2)
  21. # print(Foo.a2) #自己测试结果:2
  22.  
  23. 结果:
  24. 666
  25. 1
  26. 找不到
  27. 找不到
  28. 1
  29. 找不到

11.

  1. # 没问题,但是做这样的题目一定要仔细
  2. class Foo(object):
  3. a1=1
  4. __a2=2
  5.  
  6. def __init__(self,num):
  7. self.num=num
  8. self.__salary=1000
  9.  
  10. def get_data(self):
  11. print(self.num+self.a1)
  12.  
  13. obj1=Foo(666)
  14. obj2=Foo(999)
  15. print(obj1.num) #
  16. print(obj1.a1) #
  17.  
  18. obj1.num=18
  19. obj1.a1=99
  20.  
  21. print(obj1.num) #
  22. print(obj1.a1) #
  23.  
  24. print(obj2.a1) #
  25. print(obj2.num+Foo.a1) #
  26. print(obj2.num+obj1.a1) #

12.

  1. #注意下面的四种玩法
  2. class Foo(object):
  3. hobby='大保健'
  4. def __init__(self,num):
  5. self.num=num
  6. self.__salary=1000
  7. def f1(self):
  8. print(Foo.hobby)
  9. @staticmethod
  10. # def f2(self):
  11. def f2(): #注意这个静态方法不能有self,有self不会调用
  12. print(Foo.hobby)
  13. @classmethod
  14. def f3(cls):
  15. print(cls.hobby)
  16. @property
  17. def f4(self):
  18. print(Foo.hobby)
  19. # print(self.hobby)
  20. f=Foo(200)
  21. f.f1()
  22. f.f2()
  23. f.f3()
  24. f.f4

13.

  1. class Foo(object):
  2. @classmethod
  3. def f3(cls):
  4. print(cls)
  5. Foo.f3() #结果:<class '__main__.Foo'>

14.

  1. class Foo(object):
  2. @classmethod
  3. def f3(cls):
  4. print(cls)
  5. obj=Foo()
  6. obj.f3() #结果:<class '__main__.Foo'>

15.

  1. #我认为是一样的
  2. #结果是一样的,和我推测的一样
  3.  
  4. class Foo(object):
  5. @classmethod
  6. def f3(cls):
  7. print(cls)
  8. def f2(self):
  9. self.f3() #<class '__main__.Foo'>
  10. Foo.f3() #<class '__main__.Foo'>
  11. obj=Foo()
  12. obj.f2()

16.

  1. class Base(object):
  2. @classmethod
  3. def f3(cls):
  4. print(cls)
  5. def f1(self):
  6. print('base.f1')
  7. self.f3() #子类中有的话,用子类的,没有则用父类的
  8. class Foo(Base):
  9. # def f3(self):
  10. # print('123')
  11. def f2(self):
  12. print('foo.f2')
  13. self.f1()
  14. obj=Foo()
  15. obj.f2()
  16.  
  17. #结果:
  18. foo.f2
  19. base.f1
  20. <class '__main__.Foo'>

17.请编写一个私有的静态方法,并通过代码证明私有方法不能再外部方法但可以在内部访问。

  1. #注意,我们可以在内部通过,自己的类和未私有化的方法来调用私有化的静态方法
  2. class Person:
  3. __qie='潘潘' #私有类变量
  4. def __init__(self,name,mimi):
  5. self.name=name
  6. self.__mimi=mimi #__mimi代表的是 私有方法
  7. #
  8. @staticmethod
  9. def __donggua(self):
  10. # def donggua(self):
  11. print('你好啊!')
  12. def gaosu(self):
  13. # __donggua()
  14. Person.__donggua(self)
  15. print(f'把秘密告诉了太白,第二天所有人都知道了"{self.__mimi}"')
  16. p=Person('wusir','和嫂子的故事')
  17. # print(p.__mimi) #私有的内容只能在类里面调用
  18. #除非主动暴露自己的秘密,否则,不会
  19. p.gaosu()
  1.  
  1.  

巨蟒python全栈开发-第17天 核能来袭-成员的更多相关文章

  1. 巨蟒python全栈开发-第20天 核能来袭-约束 异常处理 MD5 日志处理

    一.今日主要内容 1.类的约束(对下面人的代码进行限制;项目经理的必备技能,要想走的长远) (1)写一个父类,父类中的某个方法要抛出一个异常 NotImplementedError(重点) (2)抽象 ...

  2. 巨蟒python全栈开发-第16天 核能来袭-初识面向对象

    一.今日内容总览(上帝视角,大象自己进冰箱,控制时机) #转换思想(从面向过程到面向对象) 1.初识面向对象 面向过程: 一切以事物的发展流程为中心. 面向对象: 一切以对象为中心,一切皆为对象,具体 ...

  3. 巨蟒python全栈开发-第19天 核能来袭-反射

    一.今日主要内容 1.isinstance,type,issubclass A.isinstance: 判断你给对象是否是xx类型的. (向上判断) B.type: 返回xxx对象的数据类型 C.is ...

  4. 巨蟒python全栈开发-第18天 核能来袭-类和类之间的关系

    一.今日主要内容: 1.类与类之间的关系 在我们的世界中事物和事物之间总会有一些联系. 在面向对象中,类和类之间也可以产生相关的关系 (1)依赖关系 执行某个动作(方法)的时候,需要xxx来帮助你完成 ...

  5. 巨蟒python全栈开发linux之centos3

    1.作业讲解 (1)递归创建文件夹/tmp/oldboy/python/{alex,wusir,nvshen,xiaofeng} 下面中的路径没有必要换,在哪里创建都行,根目录下或者tmp目录下或者其 ...

  6. 巨蟒python全栈开发linux之centos1

    1.linux服务器介绍 2.linux介绍 3.linux命令学习 linux默认有一个超级用户root,就是linux的皇帝 注意:我的用户名是s18,密码是centos 我们输入密码,点击解锁( ...

  7. 巨蟒python全栈开发django5:组件&&CBV&FBV&&装饰器&&ORM增删改查

    内容回顾: 补充反向解析 Html:{% url ‘别名’ 参数 %} Views:reverse(‘别名’,args=(参数,)) 模板渲染 变量 {{ 变量名 }} 逻辑相关 {% %} 过滤器: ...

  8. 巨蟒python全栈开发数据库前端6:事件onclick的两种绑定方式&&onblur和onfocus事件&&window.onload解释&&小米商城讲解

    1.回顾上节内容(JavaScript) 一.JavaScript概述 1.ECMAScript和JavaScript的关系 2.ECMAScript的历史 3.JavaScript是一门前后端都可以 ...

  9. 巨蟒python全栈开发linux之centos6

    1.nginx复习 .nginx是什么 nginx是支持反向代理,负载均衡,且可以实现web服务器的软件 在129服务器中查看,我们使用的是淘宝提供的tengine,也是一种nginx服务器 我们下载 ...

随机推荐

  1. Archive将多个对象归档到同一个文件

    使用archiveRootObject:toFile:方法能够将一个对象直接写入到一个文件里.但有时候可能想将多个对象写入到同一个文件里,那么就要使用NSData来进行归档对象. NSData能够为一 ...

  2. openfireserver和jdk环境删除命令

    一.卸载jdk1.8 终端依次运行以下的命令 sudo rm -fr /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin sudo rm -rf / ...

  3. redis windows 下安装及使用

    1.下载redis https://github.com/MSOpenTech/redis 2.解压下载的文档,比如D:\devSoft\redis-2.8.19 redis-benchmark.ex ...

  4. ping: icmp open socket: Operation not permitted 的解决办法

    ping: icmp open socket: Operation not permitted 的解决办法:为ping加上suid即可.报错时ping的属性: [root@localhost ~]# ...

  5. CMSGC造成内存碎片的解决方法

    我们知道,CMSGC在老生代回收时产生的内存碎片会导致老生代的利用率变低:或者可能在老生代总内存大小足够的情况下,却不能容纳新生代的晋升行为(由于没有连续的内存空间可用),导致触发FullGC.针对这 ...

  6. 跟着百度学PHP[14]-PDO的预处理语句1

    预处理语句有以下两个特点: 1.效率高 2.安全性好 为什么说预处理语句效率高呢? 预处理语句就好比一个模板,比如下面的一串插入语句: insert into admin(id,username,pa ...

  7. 如何使用UltraISO将制作的ios文件挂载到虚拟机上面

    选中要挂载的文件例如图中蓝色的部分移动到上面,然后点击文件中的保存按钮就可以了. 接下来设置虚拟机上的red hat6.3 记住一定要把红色部分选中,才能在虚拟机上看到 然后点击光盘就可以看到挂载的内 ...

  8. apply 判定变量类型

    js 数据类型 6大类:object ,undefined,boolean,string,number,null,但是有时候我们经常要更准确的判断,比如,是数组,还是单例... 那么就用apply吧, ...

  9. 为什么43%前端开发者想学Vue.js

    根据JavaScript 2017前端库状况调查 Vue.js是开发者最想学的前端库.我在这里说明一下我为什么认为这也是和你一起通过使用Vue构建一个简单的App应用程序的原因. 我最近曾与Evan ...

  10. java.lang.IllegalArgumentException: SessionContext must be an HTTP compatible implementation.:模块化本地测试shiro的一些总结

    项目由于是多模块的,所以,测试的时候我想现将shiro框架进行本地测试,然后再放入框架里面,但是这个困扰我了两天了都,其实我应该想到的,只是想多试试,最后还不如多想想 先说一下系统的基本情况,项目是多 ...