面向对象及成员的基本总结复习
一:先用一个实际例子说明类:
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. win10系统Mysql5.7服务启动报:"1053错误:服务没有及时响应启动或控制请求"

    win10安装Mysql5.7: MySQL压缩包解压后,在目录下增加my.ini配置文件 [mysqld] port = basedir=D:\Mysql datadir=D:\Mysql\data ...

  2. Spring MVC-学习笔记(1)认识spring mvc

    1.基于XML Schema.Controller接口的spring mvc简单例子 1>创建一个动态Web项目,选择同时创建web.xml文件 2>在WEB-INF/lib中粘贴spri ...

  3. 一个 Java 字符串到底有多少个字符?

    来源:http://dwz.win/jqd 依照Java的文档, Java中的字符内部是以UTF-16编码方式表示的,最小值是 \u0000 (0),最大值是\uffff(65535), 也就是一个字 ...

  4. C++对象构造时,构造函数运行时并不知道VT的存在

    class A {public: A() { init(); } virtual void init() { printf("A::init\n"); }}; class B : ...

  5. Kali系统 metasploit 使用教程

    基础配置 由于kali 2.0 已经没有metasploit 这个服务了,所以service metasploit start 的方式不起作用. 在kali 2.0中启动带数据库支持的MSF方式如下: ...

  6. JEECG 深度使用培训班 周六周日公开课(一期班)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zhangdaiscott/article/details/25411023 广大技术爱好者:     ...

  7. sys模块与shutil模块

    #coding=utf-8 import sys ## sys.argv #从命令行获取参数 import shutil #文件.文件夹.压缩包.处理模块 f1 = open("test.t ...

  8. CentOS7搭建Docker镜像实战

    开发十年,就只剩下这套架构体系了! >>>   一.搭建环境 使用的是VMWare 12虚拟机安装的CentOS7 安装成功后修改ip: 1. ip addr查看相关信息: 2. 修 ...

  9. mybatis复习笔记(1):

    一.简介:什么是MyBatis 1.MyBatis是一款优秀的持久层框架,支持定制化SQL.存储过程以及高级映射.MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集.MyBatis ...

  10. vue-router的hash和history模式的区别

    一.概念 为了构建 SPA(单页面应用),需要引入前端路由系统,这也就是 Vue-Router 存在的意义. 前端路由的核心,就在于:改变视图的同时不会向后端发出请求. 为了达到这种目的,浏览器当前提 ...