###############    类的基本操作    ##############

"""
类的基本认识:
1,类就是一个模子
2,dict,list都是类,具体的一个字典和列表就是一个类的实例,就是对象,
3,类定义的时候,类名后面可以有括号,也可以没有括号,
4,类传参是通过__init__方法来传参的,只要实例化一个对象,就会调用这个方法,
5,一个类有三要素:类名,属性,方法,类名要大写,类名使用大驼峰命名法,
6,self代表类的实例,必须要有,名字不必须是self,但是约定俗成就是self
""" """
类的初始化方法(构造方法):
类在实例化的时候,会自动执行以下操作:
1,为对象在内存中分配空间--创建对象
2,为对象的属性设置初始值--初始化方法
这是初始化方法就是 __init__方法,这是对象的内置方法,初始化方法是专门来定义一个类具有哪些属性的方法!!! 如果定义属性?
语法:self.属性名=属性的初始值
第一种:self.name="tom" # 这种就把这个属性固定死了,不好,但是在类中,我们不希望属性固定
第二种:我们可以给函数增加一个形参,用形参来替换被固定死的值, """
class Person: # 类名
country = 'China' # 创造了一个只要是这个类就一定有的属性
# 类属性 静态属性
def __init__(self,*args): # 初始化方法,self是对象,是一个必须传的参数
# self就是一个可以存储很多属性的大字典
self.name = args[0] # 往字典里添加属性的方式发生了一些变化
self.hp = args[1]
self.aggr = args[2]
self.sex = args[3] def walk(self,n): # 方法,一般情况下必须传self参数,且必须写在第一个
# 后面还可以传其他参数,是自由的
print('%s走走走,走了%s步'%(self.name,n)) # print(Person.country) # 类名 可以查看类中的属性,不需要实例化就可以查看
alex = Person('狗剩儿',100,1,'不详') # 类名还可以实例化对象,alex对象 # 实例化
print(alex.__dict__) # 查看所有属性 {'name': '狗剩儿', 'hp': 100, 'aggr': 1, 'sex': '不详'}
# print(alex.name) # 查看属性值
# print(alex.hp) # 查看属性值
# alex.walk(5) # Person.walk(alex,5) # 调用方法 类名.方法名(对象名),这是两种调用方法, print(Person.__dict__)
# print(Person.__dict__['country'])
# Person.__dict__['country'] = '印度' # 不能修改,
# print(alex.__dict__['name'])
# alex.__dict__['name'] = '二哥'
# print(alex.name)
# alex.name = '二哥' """
# 对象 = 类名()
# 过程:
# 类名() 首先 会创造出一个对象,创建了一个self变量
# 调用init方法,类名括号里的参数会被这里接收
# 执行init方法
# 返回self
# 对象能做的事:
# 查看属性
# 调用方法
# __dict__ 对于对象的增删改查操作都可以通过字典的语法进行,但是不这么用,
# 类名能做的事:
# 实例化
# 调用方法 : 只不过要自己传递self参数
# 调用类中的属性,也就是调用静态属性,只能调用静态属性,动态属性不能调用,
# __dict__ 对于类中的名字只能看 不能操作,需要重点记忆, """

###############    类和对象的命名空间    ##############

"""
# 类里 可以定义两种属性
# 静态属性
# 动态属性 命名空间的问题:
1,类新建了之后会有一个内存空间,
2,类每次实例化一个都会再开启一个内存空间,
3,为什么静态属性可以实例化对象调用?因为在自己的空间找不到,会去类里面找,这就是原理,
4,注意实例化对象调用修改了这个属性,不会更改类里面的空间的,会在自己实例化对象里面创建一个新的属性,他是没有权限修改类里面的属性的值的,
5,这样会有一个问题,类对象修改了这个静态属性,以后使用都不会变了,你要使用类的就要把自己创建的这个属性删除,del 类实例.静态变量, # 类中的静态变量 可以被对象和类调用
# 对于不可变数据类型来说,类变量最好用类名操作,字符串,
# 对于可变数据类型来说,对象名的修改是共享的,类定义了一个静态属性是列表,这个就指向一个内存空间存储着列表,
python.language[0]='English',如果一个对象修改了类的静态属性列表,那就是整个的指向都修改了,会导致所有的实例对象都改动了,
python.language=['English'],但是如果重新赋值,就是就是独立的,不会影响到其他的对象获取这个值,是不会改变的,, 导入一个包,就相当于是一个实例化,
# 包 —— __init__
# import package —— 类的实例化的过程
# import time
# time.time()
"""
class Course:
language = ['Chinese']
def __init__(self,teacher,course_name,period,price):
self.teacher = teacher
self.name = course_name
self.period = period
self.price = price
def func(self):
pass # Course.language = 'English' # 通过类名调用静态属性,可以这样修改,
# Course.__dict__['language'] = 'Chinese' # 通过类名调用静态属性,但是不能__dict__这么修改,
# print(Course.language)
python = Course('egon','python','6 months',20000)
linux = Course('oldboy','linux','6 months',20000) python.language = ''
# print(python.language) # 类中的静态变量是可以被类和对象调用的,
# print(linux.language)
# Course.language = 'Chinese'
# print(python.language)
# print(linux.language)
# del python.language # 删除对象里面的静态属性,就可以访问到类里面的静态属性了,
# print(python.language)
# print(python.__dict__)
# print(Course.language)
# print(linux.language)
# print(linux.__dict__) # 创建一个类,每实例化一个对象就计数
# 最终所有的对象共享这个数据
# class Foo:
# count = 0
# def __init__(self):
# Foo.count += 1 # 类名操作静态属性,所有的对象都是共享的,
#
# f1 = Foo()
# f2 = Foo()
# print(f1.count) # 2
# print(f2.count) # 2
# f3 = Foo()
# print(f1.count) # 3 # 认识绑定方法,就是对象调用方法,这个方法就是绑定在这个对象上面了,
# def func():pass
# print(func)
#
# class Foo:
# def func(self):
# print('func')
# def fun1(self):
# pass
# f1 = Foo()
# print(Foo.func)
# print(f1.func)
# print(f1.fun1) #<bound method Foo.func of f1>

###############    对象之间的交互   ##############

# 对象之间的交互
# 人狗大战
class Dog:
def __init__(self,name,aggr,hp,kind):
self.name = name
self.aggr = aggr # 攻击力
self.hp = hp
self.kind = kind def bite(self,person):
person.hp -= self.aggr class Person:
def __init__(self,name,aggr,hp,sex):
self.name = name
self.aggr = aggr
self.hp = hp
self.sex = sex
self.money = 0 def attack(self,dog):
dog.hp -= self.aggr def get_weapon(self,weapon):
if self.money >= weapon.price:
self.money -= weapon.price
self.weapon = weapon
self.aggr += weapon.aggr
else:
print("余额不足,请先充值") class Weapon:
def __init__(self,name,aggr,njd,price):
self.name = name
self.aggr = aggr
self.njd = njd # 耐久度
self.price = price def hand18(self,person):
if self.njd > 0:
person.hp -= self.aggr * 2
self.njd -= 1 alex = Person('alex',0.5,100,'不详')
jin = Dog('金老板',100,500,'teddy')
w = Weapon('打狗棒',100,3,998)
# alex装备打狗棒
alex.money += 1000
alex.get_weapon(w)
print(alex.weapon)
print(alex.aggr)
alex.attack(jin)
print(jin.hp)
alex.weapon.hand18(jin)
print(jin.hp) # 组合 :就是一个属性的值是一个对象,这就是组合,

###############    继承-单继承 ,多继承先不看   ##############

# class A(object):pass   # 父类,基类,超类
# class B:pass # 父类,基类,超类
# class A_son(A,B):pass # 子类,派生类,可以多继承,继承两个类
# class AB_son(A):pass # 子类,派生类
# 一个类 可以被多个类继承
# 一个类 可以继承多个父类 —— 只有在python里,其他语言没有多继承,
# print(A_son.__bases__) # __bases__,这是查看继承了谁
# print(AB_son.__bases__)
# print(A.__bases__) # python3里面所有的类都有父类,这种就叫做新式类 # 任何没有继承的类都是默认继承了object, # 继承和抽象有密切的关系,比如动物类,狗类,猫类,鸟类,人类,继承就是为了能使得代码简洁,
# 单继承,派生属性和派生方法
# 派生方法就是父类没有的方法, # class Animal:
# def __init__(self,name,aggr,hp):
# self.name = name
# self.aggr = aggr
# self.hp = hp
#
# def eat(self):
# print('吃药回血')
# self.hp+=100 # def func(self):
# print('Animal.func')
#
# class Dog(Animal):
# def __init__(self,name,aggr,hp,kind):
# Animal.__init__(self,name,aggr,hp) #
# self.kind = kind # 派生属性
# def eat(self):
# Animal.eat(self) # 如果既想实现新的功能也想使用父类原本的功能,还需要在子类中再调用父类
# self.teeth = 2
# def bite(self,person): # 派生方法
# person.hp -= self.aggr # def func(self): # 对父类的重写,
# print('Dog.func')
#
# jin = Dog('金老板',100,500,'吉娃娃')
# jin.eat()
# print(jin.hp) # 父类中没有的属性 在子类中出现 叫做派生属性
# 父类中没有的方法 在子类中出现 叫做派生方法
# 只要是子类的对象调用,子类中有的名字 一定用子类的,子类中没有才找父类的,如果父类也没有报错
# 如果父类 子类都有 用子类的
# 如果还想用父类的,单独调用父类的:
# 父类名.方法名 需要自己传self参数
# super().方法名 不需要自己传self
# 正常的代码中 单继承 === 减少了代码的重复
# 继承表达的是一种 子类是父类的关系
class Animal:
def __init__(self,name,aggr,hp):
self.name = name
self.aggr = aggr
self.hp = hp
def eat(self):
print('吃药回血')
self.hp+=100 class Dog(Animal):
def __init__(self,name,aggr,hp,kind):
super().__init__(name,aggr,hp) # 只在新式类中有,python3中所有类都是新式类
self.kind = kind # 派生属性
def eat(self):
super().eat() # 这一步就是把父类的代码继承过来了,
print('dog eating') # jin = Dog('金老板',200,500,'teddy')
# print(jin.name)
# jin.eat()
# super(Dog,jin).eat() """
# 重写父类方法有两种情况:
# 第一种情况,覆盖父类的方法
# 如果父类的方法不能满足子类的需要,就需要重写父类的方法
# 怎么实现:定义一个和父类同名的方法,然后自己实现就可以了,调用的时候会调用子类的重写的方法
# 第二种情况:对父类方法进行扩展
# 就是子类方法包含了父类方法的实现,这是在父类的基础上,增加功能,
# 怎么实现:
# 仍然需要重写父类的方法,
# 1,针对子类特有的的需求,编写代码
# 2,使用super调用原本父类中封装的方法
# 3,增加其他子类的代码 """

###############    多态    ##############

# 多态 python 天生支持多态
# 什么是多态?
# 举例说明就是Python创建变量,或者传递参数的时候不需要声明数据类型,你传什么类型都是可以的,
# 一个变量可以是多种数据类型,这就是多态的表现,就是有多种形态, # Python崇尚鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’
# list tuple,这两个数据类型有很多的相似的方法,都是并没有继承同一个父类,
# 什么是鸭子类型?
# 就是不崇尚根据继承所得来的相似,我只是自己实现我自己的代码就可以了。
# 如果两个类刚好相似,并不产生父类的子类的兄弟关系,而是鸭子类型,这个鸭子类型就是相似,
# 优点 : 松耦合 每个相似的类之间都没有影响
# 缺点 : 太随意了,只能靠自觉 # 举例Python中的鸭子类型 : list tuple 这种相似,是自己写代码的时候约束的,而不是通过父类约束的 # 强类型语言 多态
# python 语言 鸭子类型

###############    封装    ##############

# 广义上面向对象的封装 :代码的保护,面向对象的思想本身就是一种
# 只让自己的对象能调用自己类中的方法 # 狭义上的封装 —— 面向对象的三大特性之一
# 属性 和 方法都藏起来 不让你看见
# 私有属性和私有方法,本质上就是在属性名前面加了一个: _类名
# 只能在类的内部访问,外部不能访问,
# 怎么定义:在定义属性或者方法的时候,在属性名或者方法名前面增加两个下划线,就是定义私有属性或者方法了,
class Women:
def __init__(self,name):
self.name=name
self.__age_private=18
self.age_public=19 def __str__(self):
'''对类的描述'''
return '这是一个女人类' def secret_public(self):
print('名字是%s,年龄是%d'%(self.name,self.__age_private)) # # 所以私有属性外部不能访问,,但是内部可以访问, def __secret_private(self): # 私有方法
print('名字是%s,年龄是%d'%(self.name,self.__age_private)) xiaomei=Women('小美')
print(xiaomei.age_public)
# print(xiaomei.__age_private)
print(xiaomei._Women__age_private) # python中没有真正意义上的私有,#在日常开发中,不要使用这种方法去访问对象的属性和方法
xiaomei.secret_public() # 所以私有属性外部不能访问,,但是内部可以访问,
# xiaomei.__secret_private()
print(xiaomei.__dict__) # {'name': '小美', '_Women__age_private': 18, 'age_public': 19},
xiaomei._Women__secret_private()
print(xiaomei) # __str__,输出的就是对类的描述,不再是一个看不懂的内容了, # 所有的私有 都是在变量的左边加上双下划綫
# 对象的私有属性
# 类中的私有方法
# 类中的静态私有属性
# 所有的私有的 都不能在类的外部使用

###############    类的基本操作    ##############

###############    类的基本操作    ##############

python语法基础-面向对象-基础-长期维护的更多相关文章

  1. python语法基础-面向对象-进阶-长期维护

    ###############    @property定义属性    ############## # 所以对于定义属性你有好几种方式了和种类了,# 静态属性,动态属性, # property # ...

  2. 8.python笔记之面向对象基础

    title: 8.Python笔记之面向对象基础 date: 2016-02-21 15:10:35 tags: Python categories: Python --- 面向对象思维导图 (来自1 ...

  3. 第二十五节:Java语言基础-面向对象基础

    面向对象 面向过程的代表主要是C语言,面向对象是相对面向过程而言,Java是面向对象的编程语言,面向过程是通过函数体现,面向过程主要是功能行为. 而对于面向对象而言,将功能封装到对象,所以面向对象是基 ...

  4. python语法学习面向对象之继承

    python语法学习面向对象之继承 转载自:http://www.cnblogs.com/Joans/archive/2012/11/09/2757368.html 只要涉及到面向对象,”类“是必须出 ...

  5. 转 python语法学习面向对象之继承

    传送门 python语法学习面向对象之继承 只要涉及到面向对象,”类“是必须出现的一个代名词. 类和对象是面向对象编程的两个主要方面.类创建一个新类型,而对象是这个类的实例. 类的一些概念: 包括初始 ...

  6. python基础--面向对象基础(类与对象、对象之间的交互和组合、面向对象的命名空间、面向对象的三大特性等)

    python基础--面向对象 (1)面向过程VS面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. ...

  7. python之路 面向对象基础 XML

    一.面向对象基础 1.类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义 ...

  8. 深入理解python(一)python语法总结:基础知识和对python中对象的理解

    用python也用了两年了,趁这次疫情想好好整理下. 大概想法是先对python一些知识点进行总结,之后就是根据python内核源码来对python的实现方式进行学习,不会阅读整个源码,,,但是应该会 ...

  9. Python学习之面向对象基础

    python的面向对象和以前学的c++,Java都是一般,大同小异,面向对象基础先谈谈类的构造,编写,属性和方法的可见性等等 1.定义类,创建和使用对象 #定义类 class Student(obje ...

  10. sql+PHP基础+面向对象基础简单总结

    一.MYSQL         1.配置MySql                 第一步安装服务器(apache).                 第二部安装MySql界面程序         2 ...

随机推荐

  1. 【Python】关于import QtCore报错的处理方法

    刚开始学习使用PyQT,但总碰到一些小挫折 比如 import Pyqt成功 而 from PyQt5 import QtCore, QtGui, QtWidgets却报错,找了半天终于找到资料,原因 ...

  2. 苹果下架2.5万赌博APP!一场净化风暴正在迅速成型

    当下智能手机发展得如火如荼,但对于大众来说,体验终究还是要落到包罗万千的APP上.APP身为智能手机的灵魂,全面渗入了大众的工作.生活.娱乐.学习等多个方面.每一个APP的背后,其实都在打开着一扇通往 ...

  3. 导入的Java Web项目提示找不到javax.servlet.http.*包

    在网上下载了个Java web项目,导入到eclipse发现以下错误 解决办法: 1.右击项目,进入Configure Build Path 2.在Libraries标签下点击Add Library. ...

  4. vue-router HTML5 History 模式(转自官网)

    vue-router 默认 hash 模式 -- 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载. 如果不想要很丑的 hash,我们可以用路由的 his ...

  5. Excel Old format or invalid type library 错误原因

    Old format or invalid type library 错误原因 调用excel方法失败,Old format or invalid type library 解决方案: 1,这是Exc ...

  6. CodeForces 1292A NEKO's Maze Game(思维)

    #include <stdio.h> #include <string.h> #include <iostream> #include <string> ...

  7. PAT Basic 1013 数素数 (20) [数学问题-素数]

    题目 令Pi表示第i个素数.现任给两个正整数M <= N <= 10^4,请输出PM到PN的所有素数. 输⼊格式: 输⼊在⼀⾏中给出M和N,其间以空格分隔. 输出格式: 输出从PM到PN的 ...

  8. py02_01:初识模块

    模块的定义:模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被别的程序引入,以使用该模块中的函数等功能.(可以理解为:库) 模块分为三类 ( 1. 标准库:     直接导入使用 ...

  9. Python上楼梯

    假设一段楼梯共n(n>1)个台阶,小朋友一步最多能上3个台阶,那么小朋友上这段楼梯一共有多少种方法. (小朋友真的累,我选择电梯) 大体思路用到了递归,假如说楼梯有12阶,那么11阶时有只有一种 ...

  10. vuex的优缺点

    vuex的优点 1.解决了非父子组件的消息传递(将数据存放在state中) 2.减少了AJAX请求次数,有些情景可以直接从内存中的state获取 vuex的缺点 1.刷新浏览器,vuex中的state ...