面向对象

类:把一类事物的相同特征和动作整合到一起就是类,类是一个抽象的概念

对象:就是基于类出而创建的一个具体的事物或实例(具体存在),其特征和动作整合到一起

面向对象设计:将一类具体事物的数据和动作整合到一起,即面向对象设计

def dog(name,gender,type):

    def jiao():
print('一条狗%s正在叫'%name) def chishi():
print('%s正在吃fan'%name) def init(name,gender,type):
doog={
'name':name,
'gender':gender,
'type':type,
'jiao':jiao,
'chishi':chishi
}
return doog
res=init(name,gender,type)
return res d1=dog('alex','母','藏獒')
print(d1)
d1['jiao']()
d1['chishi']()

面向对象编程:用定义类+实例/对象的方式去实现面向对象的设计

使用class独特的语法完成面向对象设计,使用class后无需return   init函数的结果,本质上是初始化函数并返回init函数的值

class Dog:
def __init__(self,name,gender,type):
self.name=name
self.gender=gender
self.type=type
def jiao(self):
print('一条狗%s正在叫'%self.name) def chishi(self):
print('%s正在吃fan'%self.name) dog1=Dog('alex','female','京巴')
dog2=Dog('blex','male','藏獒')
dog3=Dog('clex','male','腊肠') dog1.chishi()
dog2.jiao()
print(dog1.__dict__)

声明类:

class Chinese:
'''
这是中国人的类
''' pass print(Chinese) #创建一个类
class Data:
pass #用类Data实例化出一个对象d1
d1=Data()

python2中class Chinese:为经典类,class Chinese(父类):为新式类

pyhton3中上述两类都是新式类

属性

类是用来描述一类事物,类的对象指的是这一类事物中的一个个体

是事物就要有属性,属性分为

1.数据属性:就是变量

2.函数属性:就是函数,在面向对象里通常称为方法

注意:类和对象均用点来访问自己的属性

class Chinese(object):
'''
这是一个中国人的类
'''
party='党' print(Chinese.party)
class Chinese():
'''
这是一个中国人的类
''' # def __init__(self, name):
# self.name=name
party='党'
def love_nation(self):
print('中国人都爱国')
def warm_heart(self):
print('中国人%s热心'%self) print(Chinese.party)
print(dir(Chinese))
Chinese.love_nation(1)
Chinese.warm_heart('asfasf')
print(Chinese.__dict__)
Chinese.__dict__['love_nation'](1)
Chinese.__dict__['warm_heart']('asfasf')

Chinese.love_nation(1)本质上是调用Chinese.__dict__['love_nation'](1)

特殊的类属性:

__name__      类名

__doc__         类的文档字符串

__base__    类的第一个父类

__bases__ 类的所有父类构成的元组

__dict__  类的属性

__module__  类定义所在的模块

__class__  实例对应的类

类的属性

风湿理论:数据属性即变量,类的定义与函数极其类似,可以用函数的作用域来理解类的属性调用

对象相关知识

class Chinese():
'''
这是一个中国人的类
''' def __init__(self, name,gender,age):
print('我是初始化函数,我运行了')
self.name=name
self.gender=gender
self.age=age
print('我运行完了')
#这个函数会自动返回一个None,不能返回其他值
party='党'
def love_nation(self):
print('中国人都爱国')
def warm_heart(self):
print('中国人%s很热心'%self.name) p1=Chinese('Alex','male',18)#实例化,触发__init__函数的运行,会将p1传给self位置参数
print(p1.__dict__)
print(p1.gender)
p1.warm_heart()
print(p1.party)

实例属性字典中没有函数属性,实例调用方法时会根据风湿理论在上一层类中找方法,没有则报错,有则调用,可以把class当作最外层的函数,是一个作用域

若类中方法没有self参数,实例调用类中方法时会将自己作为参数传给方法,会报错

self代表实例本身,python会自动将实例本身传给self参数

实例化的过程实际就是执行__init__的过程,这个函数内部只是为实例本身即self设定了一堆数据(变量),所以实例只用数据属性

 类属性

数据属性: 

查看类属性:Chinese.party

修改类属性:Chinese.party='我党'

增加类属性:Chinese.city='北京'

删除类属性:del Chinese.party

 函数属性:

增加:

def play(self,ball):
print('%s在玩%s'%(self.name,ball)) Chinese.play_ball=play
p1.play_ball('basketball')

修改:

def test(self):
print('test')
Chinese.play_ball=test
p1.play_ball()

作用域:

class Chinese:
country='china'
def __init__(self,name):
self.name=name p1=Chinese('alex')
p1.country='Deutsch'
print('类的>>>',Chinese.country)
print('实例的>>>',p1.country) >>>类的>>> china
实例的>>> Deutsch

报错:

country='china'
class Chinese: def __init__(self,name):
self.name=name p1=Chinese('alex') print(p1.country)
Country='china'
class Chinese: def __init__(self,name):
self.name=name
print(Country) p1=Chinese('alex') >>>china

变量与属性的区别:

只又通过.找到的是属性,作用域在类里

Country='china'
class Chinese: def __init__(self,name):
self.name=name
print(Country)#这里的Country是变量,不是类的属性也不是实例的属性 p1=Chinese('alex') >>>china
country='China'
class Chinese:
country='Deutsch'
def __init__(self,name):
self.name=name
print(country) p1=Chinese('alex')
print('这是实例的----->',p1.country) >>>China
这是实例的-----> Deutsch

=号相当于给实例添加一个属性值

class Chinese:
country='China'
l=['a','b']
def __init__(self,name):
self.name=name p1=Chinese('alex')
p1.country='Deutsch'
print(p1.country)
print(Chinese.country)
p1.l=[1,2,3]
print(Chinese.l) >>>Deutsch
China
['a', 'b']

append本质上调用的是类的属性,而不是给实例赋一个新的值

class Chinese:
country='China'
l=['a','b']
def __init__(self,name):
self.name=name p1=Chinese('alex') p1.l.append('c')
print(p1.__dict__)
print(Chinese.l) >>>{'name': 'alex'}
['a', 'b', 'c']

__call__()的作用是使实例能够像函数一样被调用,同时不影响实例本身的生命周期(__call__()不影响一个实例的构造和析构)。但是__call__()可以用来改变实例的内部成员的值

__call__()函数解释:https://blog.csdn.net/qq_18649781/article/details/89705611

1

python_13 面向对象的更多相关文章

  1. angular2系列教程(六)两种pipe:函数式编程与面向对象编程

    今天,我们要讲的是angualr2的pipe这个知识点. 例子

  2. 一起学 Java(二)面向对象

    一.方法函数 函数也称为方法,就是定义在类中的具有特定功能的一段独立代码.用于定义功能,提高代码的复用性. 函数的特点1> 定义函数可以将功能代码进行封装,便于对该功能进行复用:2> 函数 ...

  3. js面向对象学习 - 对象概念及创建对象

    原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...

  4. 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

    前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...

  5. .NET 基础 一步步 一幕幕[面向对象之对象和类]

    对象和类 本篇正式进入面向对象的知识点简述: 何为对象,佛曰:一花一世界,一木一浮生,一草一天堂,一叶一如来,一砂一极乐,一方一净土,一笑一尘缘,一念一清静.可见"万物皆对象". ...

  6. 简单分析JavaScript中的面向对象

    初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...

  7. Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...

  8. JavaScript学习笔记(三)——this、原型、javascript面向对象

    一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...

  9. 带你一分钟理解闭包--js面向对象编程

    上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...

随机推荐

  1. CodeForce 517 Div 2. C Cram Time

    http://codeforces.com/contest/1072/problem/C C. Cram Time time limit per test 1 second memory limit ...

  2. [随笔][Java][something]

    import 只能导入包中的类,不能导入某个包.为了方便,一般不导入单独的类,而是导入包下的所有类.import java.util.*; 包java.lang中的所有类默认由编译器全部导入了,不必手 ...

  3. Taro 代码及功能,需要注意的地方

    Taro 代码不能使用的写法: 请注意无 AppID 关联下,调用 wx.operateWXData 是受限的, API 的返回是工具的模拟返回

  4. mq的基本介绍和基本用法

    1.什么是MQ,有什么用? MQ 是message queue ,消息队列,也叫消息中间件,遵守JMS(java message service)规范的一种软件.(同时还有另一个叫AMQP的应用层协议 ...

  5. winmount导致资源管理器崩溃

    今天,在别人电脑上遇到一个问题,右键点击某个特定文件夹会导致资源管理器崩溃重启,提示为: Runtime Error! Program: C:\Windows\Explorer.exe This ap ...

  6. linux下钉钉,微信

    google-chrome --app=https://im.dingtalk.com/ google-chrome --app=https://wx.qq.com/

  7. 如何开启 MySQL InnoDB 共享表空间和独立表空间

    修改数据库的表空间管理方式 修改my.ini文件的innodb_file_per_table的参数值即可,但是修改不能影响之前已经使用过的共享表空间和独立表空间: innodb_file_per_ta ...

  8. 黄聪:mysql主从配置(清晰的思路)

    mysql主从配置.鄙人是在如下环境测试的: 主数据库所在的操作系统:win7 主数据库的版本:5.0 主数据库的ip地址:192.168.1.111 从数据库所在的操作系统:linux 从数据的版本 ...

  9. rabbit原理及项目应用

    1.rabbitMQ是什么? mq是由erlang语言开发的开源的amqp的实现. 2.rabbitMQ的基本原理是什么? 使用RabbitMQ,首先需要与rabbitMQ的visiu host建立连 ...

  10. To be taught if i am fortunate

    此博客算是我自娱自乐的海洋球池吧. 由于我十分的菜并且文笔拙劣,所以您可能并不能在这找到什么有用的信息或者好玩的东西(或者exciting的内容). 如果您能指出我的一些错误,我将十分感激.