一.今日主要内容
    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天 核能来袭-成员的更多相关文章

  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. hadoop2.7.0实践- WordCount

    环境要求 说明:本文档为wordcount的mapreduce job编写及执行文档. 操作系统:Ubuntu14 x64位 Hadoop:Hadoop 2.7.0 Hadoop官网:http://h ...

  2. 让python cookie支持特殊字符

    让python cookie支持特殊字符 先对cookie做下简单的介绍 cookie的作用: tcp协议能够通过三次握手建立连接.client发送的多次请求能够通过句柄维护同一个连接.可是http协 ...

  3. 兼容placeholder

    众所周知.IE9以下不兼容placeholder属性,因此自己定义了一个jQuery插件placeHolder.js.以下为placeHolder.js的代码: /** * 该控件兼容IE9下面,专门 ...

  4. kali2.0下配置Metasploit+postgresql链接

    工具/原料   kali2.0 方法/步骤     1.postgresql是本身没有启动的.所以需要启动. service postgresql start   2.通过命令进入配置 sudo -u ...

  5. Java并发编程(二):JAVA内存模型与同步规则

    一.Java内存模型(JMM) 它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式.一个线程如何和何时能看到其他线程共享变量的值,以及在 ...

  6. linux下的几个cd命令

    linux cd命令 cd data 进入到 data 目录 cd .. 返回上级文件夹 cd ~ 返回用户主文件夹 cd / 返回根文件夹

  7. Atitit.ati  str  字符串增强api

    Atitit.ati  str  字符串增强api 1. java StringUtils方法全览 分类: Java2011-11-30 17:22 8194人阅读 评论(2) 收藏 举报 javas ...

  8. phoenix查询缓慢问题

    现象:phoenix刚建表时查找很快,随着数据导入越来越多,查询越来越缓慢,执行explain这个表的计划都需要好几秒,但在hbase shell里查询很快 问题定位:这个是由于system.stat ...

  9. winform 打印条码

    一个winform打印功能的示例 操作步骤:1.新建winform项目及创建窗体2.拖取 打印 相关控件 PageSetupDialog . PrintDialog . PrintDocument . ...

  10. CSRF学习笔记之CSRF的防御【00x4】

    referer 验证 根据HTTP协议,在http请求头中包含一个referer的字段,这个字段记录了该http请求的原地址.通常情况下,执行转账操作的post请求www.bank.com/trans ...