面向对象及成员的基本总结复习
一:先用一个实际例子说明类:
class 类名:
class Car:
#__init__ :使我们在具体构造一个对象时,使这个对象有具体的属性,像有名字啊,价格等等这样的属性
#self :就是这个构造方法在执行这个类时候,将对象传递给self ,self:是谁调用的,谁就是self,
#像上面车的例子,如果是c2调用的,那么self就是c2。c掉调用的,self就是c
def __init__(self,user,color,price): #将Car 这个类的基本属性进行封装。
self.user=user
self.color=color
self.price=price def Drive(self,a): #表示车的一个方法
print("这辆车很赞!",a) #调用方法和属性遇到的问题:我们在调用属性( 价格, 颜色)的时候是不要写 括号的()直接 c1.color ,
#调用方法才需要写括号() ,c1.Drive()
c1=Car("旺财","red","88RMB") #Car() 类加上括号后是将类进行实例化,实例化到具体的一辆车,然后
这个车有基本的属性:所有者,颜色,价格等。。。 print(c1.color) #我们在调用属性( 价格, 颜色)的时候是不要写 括号的() ,,
print(c1) #打印的是一个内存地址
c1.Drive("") #对象调用这个具体的方法 #调用方法才需要写括号()
二:我们在写类的时候一定会遇到 类里面的 方法:我们用  def __init__(self,属性一,属性二....) (这个是固定写法) 来给我们要创建
的具体对象构造基本的属性,使其具有具体的属性,(面向对象是以具体的对象为主)
构造方法和 函数有点相同
  函数:
def num(): #定义函数名字
print("")
num() #打印:123 #调用这个函数,然后执行print 语句
print(num()) #打印:123 None (num函数被调用,然后执行print语句,但是因为没有返回值,所以再次输出的时候,没有返回值返回回来
所以输出的就是 None ) 构造方法:(需要结合类来理解)
class Name:
def __init__(self,changduan,yuyan): #里面放名字的属性,进行封装。(比如名字有的是英文,有的长,有的短。。。)
self.changdu=changduan #这些属性我们也称之为属性变量
self.yuyan=yuyan def shuo(self): #名字的作用我们也成为 一个方法
print("说明一个人!")
#return "111" mz=Name("四个字","中文") #Name() 实例化到具体一个名字,他又具体的属性是 几个字 和 是中文表达。
print(mz.changdu)#调用属性 #调用具体对象的属性的时候,是不需要加括号的,直接 mz.cahgndu 然后打印就可以了
mz.shuo() #打印:说明一个人!
print(mz.shuo()) #打印:说明一个人! None (方法被调用时,先执行 print语句 ,这个和函数的返回值一样,当执行完调用后,
#如果有返回值则返回需要返回的值,如果没有返回值,则返回None # )

    总结:函数和方法的其中一个区别:方法比函数多了一个 self  。

    主要是调用的时候会经常脑袋浆糊啊:.......
函数调用: 函数名() 然后执行函数体,有返回值则返回,没有则print (函数名 ())返回None
方法调用:在将类实例化后 例如 mz=Name("四个字","中文") ,
调用属性: mz.price 就可以了
调用方法时需要加括号:mz.shuo()
三:面向对象的三大特征:
   001:封装
002:继承 :分为单继承(只继承一个父类的特性,那么只有一个父类的全部非私有特性)和多继承(继承多个父类的特性,具有多个父类全部
非私有的特性)
003:多态:同一个对象有多个形态 持续 懵b中...需要实际例子再加深理解下
四:类的成员:
类的成员:在类中写的什么,就是成员
例子:
  class Person:
#方法
def __init__(self,参数1,参数2.....):
#属性变量
self.属性1=参数1
self.属性2=参数2
....
#方法
def method(self):
pass
五:类的成员:变量
类的变量两大类:
 1:实例变量:(字段)
2:类变量(静态变量)
实例变量:就是具体的一个对象所具有的特性(像 大小啊 名字啊等等)。
类变量:就是一大陀群体都具有的特特性 实例变量和类变量的基本对比:
类变量就是 这个特性是所有具体对象都拥有的,不管这个类的那一个具体对象是谁,
它都有这个特性(像人类都拥有名字这个特性一样),当这个类变量发生变化时,那么
这个类的所有具体对象都有的这个特性也就一起变了

001 类变量案例:

class Person: #一个Person 类
country="中国" #类变量, 表示所有的该类的对象都共享这个变量.
def __init__(self,name,age):
self.name=name
self.age=age
p1=Person("qw",34)
p1.country="大清" #对比我们之前写的 c=Car() c.color() # p1.name() #面向对象中,这样写是调用方法的,不是调用属性 #TypeError: 'str' object is not callable print(p1.name)
print(p1.country) p2=Person("",56)
print(p2.name) #
print(p2.country) #
    002):实例变量 :当我们给当前这个对象添加一个实例变量的时候,那么这个类变量是不会改变的,
改变的只是当前这个对象的实例变 案例:
p1 = Person("alex", 18, "1840年06⽉01⽇")
# # 在执行p1.country = "大清"的时候. 其实 并没有去改变类中的country,
# 而是给对象添加了⼀个实例变量. 并且这个实例变量,只有当前的p1是存在的.
# 在p2中是不存在的
p1.country = "⼤清" #给p1添加实例变量 ,p2 是没有的
print(p1.name)
print(p1.country) # ⼤清
p2 = Person("wusir", 28, "1894年07⽉25⽇")
print(p2.name)
print(p2.country) # 中国
六:类的成员:方法
成员方法:对象直接访问这个方法(我们也称之实例方法)
访问:直接是 对象访问 -----> 对象名.成员方法名()
成员方法作用:待更新....... 静态方法:需要在方法之前添加 @staticmethod 来表示这个方法是一个静态方法
调用:直接是类名直接调用和访问 ----> 类名.静态方法名() 和静态变量一样
调用的时候 对象也可以调用(--> 对象名.静态方法名() ),但是我们不会这么干,为了区分静态方法和实例方法
静态方法作用:待更新....... 类方法: 需要在方法之前添加 @classmethod 来表示这个方法是一个类方法,并且第一个值我们默认给第一个参数为cls
调用和访问: 直接是类名调用 -----> 类名.类方法名字()
类方法的作用:待更新.......
案例编写:
  案例一
  

class QiuGe:
# def __init__(self,name,age,salary):
# self.name=name
# self.age=age
# self.salary=salary
def salary(self):
print("日进斗金")
def gf(self):
print("单身狗")
def shenggao(self):
print("东北人老高儿了")
def sum(self,a,b):
return a+b
c=QiuGe()
c.salary() #类直接调用实例方法
c.shenggao()
print(c.sum(1,5))
  案例二:
  

class Car:

        @classmethod
def red(cls):
print("") c=Car()
c.red() #用对象去调用类方法
print(c.red()) # 为啥打印: 123 None (c调用red 但是red方法没有返回值,所以打印NOne)
总结: #不管用对象还是类去访问类方法,传递进去的都是类
Car.red() #用类去调用类方法
不建议用对象去调用类方法,调用属性不需要加括号,调用方法需要加括号
七:类的成员 - 属性
属性其实就是通过⽅法改造过来的⼀种变量的写法, 在⽅法上添加⼀个 @ property就可以
案例
class User:
def __init__(self,name,birthday,email):
self.name=name
self.birthday=birthday
self.email=email
@property #作用是将一个方法变成一个属性(像名字啊,年龄啊,具体的东西)
def age(self):#方法
return 2018-self.birthday
u=User("xu",1878,"123@email.con")
print(u.age) #我们调用属性的时候是不需要写 括号的的,在调用方法的时候才需要u.age()
# print(u.age())
属性的总结:
1. 方法参数只能有⼀个self
2. 方法上方要写@property
3. 调用的时候, 我们不需要写括号. 直接当成属性变量来⽤就可以了.
4. 这种套路只能取值. 不能设置值
八:私有:python中以 __ 作为方法或则变量的前缀 ,表示这个方法或则变量是一个私有的
私有变量例子:
class Person:
def __init__(self,name,age):
self.__name=name #____name 私有变量,其他的对象user不能访问
self.__age = age #__age 私有变量,其他的对象user不能访问
user=Person("旺财",23)
# user.name() #这个是直接调用类里面的属性
# print(user.name) #个是直接调用类里面的属性
print(user.__name) #报错AttributeError: 'Person' object has no attribute '__name' ###私有的外部成员访问不到,但是内部的方法是可以访问的
例子:
class Person:
def __init__(self,name,age): #这个是构造方法
self.name=name
self.__age=age #私有的变量
print("构造方法") def __chi(self):
print("私有方法__chi") def he(self):
print("非私有方法") def wan(self):
self.__chi() #内部调用私有方法__chi --〉 -----内部调用的方法,很重要啊 记住-----
print("我调用了内部的私有方法 __chi()")
P=Person("xu",32)
P.wan()
打印:
构造方法
私有方法__chi
我调用了内部的私有方法 __chi()
作业代表性题目代码:
  

第一题:
1. while 循环提示用户输入:用户名、密码、邮箱
2.为每个用户创建一个对象,并添加到列表中。
3.当列表中的添加了 3 个对象后,跳出循环并以此循环打印所有用户的姓名和邮箱。 class UserInfo:
def __init__(self,name,password,email): #定义一个属性封装
self.name=name
self.password=password
self.email=email
lst=[]
while len(lst)<3:
Yname=input("请输入您的账号名字:")
Ypwd=input("请输入密码:")
youjian = input("请输入email:")
user=UserInfo(Yname,Ypwd,youjian)
lst.append(user) print(lst) #打印的是一个对象的内存地址组成的列表
for i in lst: #i 代表每一个输入的成员对象
print("我叫%s,我的邮箱是%s:" % (i.name,i.email)) 第二题:
class User: #用户
def __init__(self,name,pwd):
self.name=name
self.pwd=pwd class Account: #账户
def __init__(self):
self.user_list=[] #用户列表,数据格式[user对象,user对象,user对象] def login(self):
'''
用户登陆,用户输入用户名和密码并去self.user_list中检查用户是否合法
:return:
'''
print("登陆界面")
mingzi=input("请输入你的账号名:")
mima=input("请输入你的密码:")
for u in self.user_list:
if u.name==mingzi and u.pwd==mima: #账号密码正确则返回True
return True
else:
return False def register(self): #注册
print("注册界面")
uname=input("请输入您的注册账号名字:")
upwd=input("请输入您的注册密码:")
u=User(uname,upwd) #创建对象
self.user_list.append(u)
print(self.user_list) def run(self):
'''
主程序,先进行2次用户注册,在进行用户登陆(3次重试机会) :return:
'''
self.register()
self.register()
for i in range(3):
ret=self.login()
if ret==True:
print("欢迎登陆!")
break
else:
print("次数达到三次,已退出了!") if __name__=="__main__": #如果用户名正确,则执行下面的语句。
obj=Account()
obj.run()
 

python学习之路---day16--面向对象的更多相关文章

  1. python学习之路-8 面向对象之进阶

    上篇内容回顾和补充 面向对象三大特性 封装 继承 多态 在python中没有多态的概念 变量的类型允许为多种数据类型称之为多态 # c#/java中的多态 # 伪代码 def func(int arg ...

  2. Python学习之路10☞面向对象进阶

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(objec ...

  3. Python学习之路9☞面向对象的程序设计

    一 面向对象的程序设计的由来 见概述:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二 什么是面向对象的程序设计及为什么要有它 面向过 ...

  4. Python学习之路——类-面向对象编程

    类 面向对象编程 通过类获取一个对象的过程 - 实例化 类名()会自动调用类中的__init__方法 类和对象之间的关系? 类 是一个大范围 是一个模子 它约束了事务有哪些属性 但是不能约束具体的值 ...

  5. python学习之路------你想要的都在这里了

    python学习之路------你想要的都在这里了 (根据自己的学习进度后期不断更新哟!!!) 一.python基础 1.python基础--python基本知识.七大数据类型等 2.python基础 ...

  6. python学习之路-day2-pyth基础2

    一.        模块初识 Python的强大之处在于他有非常丰富和强大的标准库和第三方库,第三方库存放位置:site-packages sys模块简介 导入模块 import sys 3 sys模 ...

  7. Python学习之路-Day2-Python基础3

    Python学习之路第三天 学习内容: 1.文件操作 2.字符转编码操作 3.函数介绍 4.递归 5.函数式编程 1.文件操作 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个 ...

  8. Python学习之路-Day2-Python基础2

    Python学习之路第二天 学习内容: 1.模块初识 2.pyc是什么 3.python数据类型 4.数据运算 5.bytes/str之别 6.列表 7.元组 8.字典 9.字符串常用操作 1.模块初 ...

  9. Python学习之路-Day1-Python基础

    学习python的过程: 在茫茫的编程语言中我选择了python,因为感觉python很强大,能用到很多领域.我自己也学过一些编程语言,比如:C,java,php,html,css等.但是我感觉自己都 ...

  10. python学习之路网络编程篇(第四篇)

    python学习之路网络编程篇(第四篇) 内容待补充

随机推荐

  1. repr_str方法

    该方法可以改变字符串的显示格式 class School: def __init__(self,name,addr,type): self.name = name self.addr = addr s ...

  2. [19/05/20-星期一] CSS_css的盒子模型

    一.盒子模型 <!DOCTYPE html> <html> <!-- div 标签 块级标签 主要用来网页布局, 会将其中的子元素内容作为一个独立的整体存在 默认宽度是页 ...

  3. [2019杭电多校第八场][hdu6667]Roundgod and Milk Tea

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6667 题目大意是说n个班级,每个班级有ai人和bi杯茶,每个人只能喝其他班的茶并且只能喝一杯.问最多有 ...

  4. Good number(3进制)

    https://codeforces.com/problemset/problem/1249/C2 C2. Good Numbers (hard version) time limit per tes ...

  5. 漫漫人生路,我们该何去何从! Python让我找到了方向

    互联网寒冬 2017年冬天,是我人生中最难熬的一个冬天,其实2017年的冬天并不算太冷,比这冬日的寒风还要严寒的要属这所谓的"互联网寒冬"吧!各大厂裁员的消息充斥着互联网,互联网表 ...

  6. 攻防世界--srm-50

    测试文件:https://adworld.xctf.org.cn/media/task/attachments/6df7b29f8f18437887ff4be163b567d5.exe 1.准备 获取 ...

  7. 【学习总结】java数据结构和算法-第三章-稀疏数组和队列

    相关链接 [学习总结]尚硅谷2019java数据结构和算法 github:javaDSA 目录 稀疏数组 队列 稀疏数组 稀疏数组介绍 图示 应用实例 代码实现 SparseArray.java:与二 ...

  8. sftp没有关闭session导致服务器sshd进程未关闭

    项目中需要用Sftp上传下载文件,通过jsch中的sftp实现.代码上了服务器之后,发觉服务器多了很多进程没有被关闭. 连接sftp代码: protected boolean connectToSer ...

  9. CSS实现单行文本溢出显示省略号

    p { width:100px;//设定宽度 //以下三个属性设置均必不可少 white-space: nowrap; text-overflow:ellipsis; overflow:hidden; ...

  10. vue.js(18)--父组件向子组件传值

    子组件是不能直接使用父组件中数据的,需要进行属性绑定(v-bind:自定义属性名=“msg”),绑定后需要在子组件中使用props[‘自定义属性名’]数组来定义父组件的自定义名称. props数组中的 ...