类属性与对象实现,init方法的作用,绑定方法,绑定方法与普通函数的区别,继承,抽象与继承,派生与覆盖
今日内容:
1.类属性与对象属性
2.init方法的作用
3.绑定方法
4.绑定方法与普通函数的区别(非绑定方法)
5.继承
6.抽象与继承
7.派生与覆盖
1.类属性与对象属性
类中应该进存储所有对象共有的内容:如所有人的国籍相同那就放到类中
对象中存储每个对象独有的内容:如每个人的名字都不同
init方法的作用
init是初始化的缩写用于为对象的属性设置初始值
- class Dog:
- # 执行时机:当实例化产生对象时会自动执行该函数
- # 会自动传入需要初始化的对象
- # 初始化必须包含至少一个参数,用于表示对象本身
- # 该函数不允许有返回值
- def __init__(self, age, name, **kwargs):
- print('init run')
- print(self)
- self.age = age
- self.name = name
- d = Dog()
- print(Dog.__init__)
- print(d)
- print(d.age)
- #
- d1 = Dog(1, '小黄')
- d2 = Dog(2, '大黄')
- print(d1.name, d2.name)
绑定方法
绑定:
即两个东西绑在一起,方法就是函数,意思就是说 绑定方法 == 绑定函数,默认情况下,再类中定义的方法,都是绑定方法,绑定方法是把函数和对象绑定到一起
为什么要绑定:
每个应用程序其实本质上都是再处理数据,那就必须明确,要处理的数据再哪里,如何处理,而绑定方法的好处在于,将需要处理的数据,以及处理数据的方法,绑定在一起,这样一来,当你获得一个对象就同时获得数据以及相应的处理方法,简单的调用即可
- # 当你创建对象时,发生了什么?
- # 1.产生一个空对象(名称空间)
- # 2. 自动调用__init__方法 ,并且把这个对象以及额外的参数传入
- class Person:
- def __init__(self, name, age):
- self.name = name
- self.age = age
- # 默认情况下,在类中的定义的方法,都是绑定方法
- def say_hi(self):
- print('hello i am %s %s岁了' % (self.name, self.age))
- # 当你创建对象时,发生了什么?
- # 1.产生一个空对象(名称空间)
- # 2. 自动调用__init__方法 ,并且把这个对象以及额外的参数传入
- p = Person('隔壁老王', 24) # hello i am 隔壁老王 24岁了
- p.say_hi()
- p2 = Person('隔壁老梵', 35) # hello i am 隔壁老梵 35岁了
- p2.say_hi()
- # 经常使用的数据定义为变量
- username = 'jack'
- pwd = ''
- db_name = 'QQ'
- atm_usr = 'rose'
- atm_pwd = ''
- # 用于登陆数据库
- def login_data_base(username, pwd, db_name):
- print('%s登陆%s数据库,密码为%s' % (username, db_name, pwd))
- # 输出结果 jack登陆QQ数据库,密码为123
- login_data_base(username, pwd, db_name)
- def login_atm(usr, pwd):
- print('%s登陆了ATM密码为%s' % (usr, pwd))
- # 输出结果,rose登陆了ATM密码为123
- login_atm(atm_usr, atm_pwd)
- # 绑定的好处是,将数据以及处理数据的方法绑定在一起,拿到对象就同时拿到数据和处理方法
- # 直接调用即可
- # 可以这么理解: 面向对象其实就是提高了整合程度,把数据和方法整合到了一起
绑定方法与普通函数的区别(非绑定方法)
当使用类调用时,就是一个普通函数,有几个参数就得传几个参数,
当用对象来调用时,是一个绑定方法了,会自动将对象作为第一个参数传入
1.绑定方法:
1.对象绑定方法
在使用对象调用时会自动传入对象本身
2.类绑定方法
@classmethod
在使用对象时会自动传入类本身
在使用类来调用时也会自动传入类本身
单列模式中就会经常使用@classmethod
到底绑给谁?:
当你的方法执行过程中需要使用到对象中数据时就绑定给对象
当你的方法执行过程中需要使用到类中的数据时就绑定给类
2.非绑定方法
即不需要对象中的数据,也不需要类中的数据,那就定义为非绑定方法,就是普通函数
@staticmethod 静态方法
- import time
- class Person:
- country = 'China'
- # init 也是绑定方法
- def __init__(self, name, age):
- self.name = name
- self.age = age
- @classmethod
- def info(cls):
- print(cls)
- print('info run')
- def sey_hi(self):
- print('hello i an %s' % self.name)
- # 是要输出这个类的一些信息
- @classmethod
- def class_info(cls):
- print('this class %s is module:xxx.py' % cls.__name__)
- # 输出当前时间
- # 不需要访问类也不需要访问对象,所以直接做成非绑定方法
- @staticmethod
- def show_time(self):
- print(time.localtime())
- # p = Person('rose', 20)
- # p.info() # 输出:info run
- # Person.info()
- # print(Person.info) # <bound method Person.info of <class '__main__.Person'>>
- # p = Person('rose', 10)
- # p.sey_hi() # hello i an rose
- # p = Person('季禹志',20)
- # Person.class_info() # 结果:this class Person is module:xxx.py
- # p = Person('rose', 1)
- # p.show_time(1)
- # # 获取时间
- # Person.show_time(2)
- # print(Person.show_time) # 结果 <function Person.show_time at 0x0000019520119C80>
- # print(p.show_time) # 结果 <function Person.show_time at 0x0000019520119C80>
继承
继承指的是一种关系,在生活中通过继承关系,例如王思聪继承王健林,对于王思聪可以,可以直接使用王健林已经拥有的
被继承的一方(王健林) 称之为父 继承的一方(王思聪) 称之为子
在OOP中 继承描述是类和类之间的关系 例如b类继承a类 b类可以直接使用a类中的属性和方法
a是父类(基类,超类) b是子类(派生类)
好处:极大的提高了代码的复用性
- # 首先,我们定义学生与老师的属性
- # 老师的属性
- class Teacher:
- school = 'oldboy'
- def __init__(self, name, age):
- self.name = name
- self.age = age
- def say_hi(self):
- print('你好啊,我是%s' % self.name)
- def teach(self):
- print('正在教书!')
- # 学生继承老师
- class Student(Teacher):
- pass
抽象与继承
继承之后可以直接使用父类的属性和方法
使用继承时 应该先抽象 在继承
抽象指的是 将一系列类中相同的特征和相同行为抽取 形成一个新的类
会产生一些与原本业务不想关的类
站在不同角度会得到不同的抽象结果
- # 上述案例中通过继承,学生拥有了老师所有的你内容,但是学生不应该拥有教书这个技能
- # 意味着这个继承关系有问题,不合理
- # 需要先抽象,再继承
- class OldBoyPerson:
- school = 'oldboy'
- def __init__(self, name, age):
- self.name = name
- self.age = age
- def say_hi(self):
- print('hello i am %s' % self.name)
- class Teacher(OldBoyPerson):
- def teach(self):
- print('正在教书。。。')
- class Student(OldBoyPerson):
- pass
- # 测试
- t = Teacher('owen',38)
- t.say_hi()
- t.teach()
- s = Student('六老师',20)
- s.say_hi()
在python3中任何类都直接或间接继承自Object
Object是所有类的基类 (根类)
其中提供一系列方法, 这样一来 无论你是什么类 ,你都可以直接是object中已经存在的方法 一切皆对象
一切皆对象指的是 在python中您所使用到的任何数据都是对象 int float list dict 模块 包 函数
属性查找顺序
- class A:
- name = 'scot'
- pass
- class B(A):
- name = 'rose'
- pass
- b = B()
- b.name = 'jack'
- print(b.name) # rose 优先查找对象自己
- # 查找顺序
- # 对象自己 -> 所在的类 -> 所在的父类 -> 父类的父类 -> object
派生与覆盖
子类拥有与父类不同的内容 就称之为派生类
覆盖 指的是子类出现了与父类完全相同(属性/方法)名称 根据查找顺序 就会优先找子类的 即覆盖了父类的内容
- '''
- 覆盖 (重写)
- 子类中出现了与父类名称相同的属性或方法,就会覆盖掉父类的属性或方法
- '''
- class A:
- text = ''
- def show_info(self):
- print('hello,world!')
- class B(A):
- text = ''
- def show_info(self):
- print('你好,我是李xx')
- pass
- b = B()
- b.show_info() # 你好,我是李xx
- print(b.text) #
在子类中访问父类已有的方法或属性
- class Person:
- text = ""
- def __init__(self,name,age,gender):
- self.name = name
- self.age = age
- self.gender = gender
- def sleep(self):
- print("人类 午睡 躺着睡!")
- def say_hi(self):
- print("my name :%s my age :%s my gender: %s " % (self.name,self.age,self.gender),end="")
- class Student(Person):
- text = ""
- def __init__(self,name,age,gender,number):
- #======================================================================重点在这里
- # 由于父类已经存在一个方法可以完成这个三参数的初始化
- # 所以可以直接调用父类的初始化完成这部分的初始化工作
- # 方法1
- # Person.__init__(self,name,age,gender) # 指名道姓的调用
- # 方法2 在py2中不支持
- super().__init__(name,age,gender)
- # py2的写法
- # super(Student, self).__init__(name,age,gender)
- self.number = number
- #======================================================================
- # 访问父类的属性
- def show_text(self):
- print(self.text)
- print(super().text)
- def say_hi(self):
- super().say_hi()
- print("my number: %s" % self.number)
- # print("my name :%s my age :%s my gender: %s my number: %s" % (self.name, self.age, self.gender,self.number))
- s = Student("jack",20,"man","")
- s.say_hi()
- # s.show_text()
类属性与对象实现,init方法的作用,绑定方法,绑定方法与普通函数的区别,继承,抽象与继承,派生与覆盖的更多相关文章
- python类属性和对象属性、类的普通方法和静态方法
类属性和对象属性的定义 class LearnClass(): #类属性 cls_attr = None def __init__(self,arg): #对象属性 self.obj_attr = a ...
- python 类属性、对象属性
类的普通属性: dir(Myclass), 返回一个key列表: Myclass.__dir__,返回一个字典: 1.类的数据属性: 2.类的方法: 类的特殊属性: 1.Myclass.__name_ ...
- Python笔记_第三篇_面向对象_8.对象属性和类属性及其动态添加属性和方法
1. 对象属性和类属性. 我们之前接触到,在类中,我们一般都是通过构造函数的方式去写一些类的相关属性.在第一次介绍类的时候我们把一些属性写到构造函数外面并没有用到构造函数,其实当时在写的时候,就是在给 ...
- 【17】有关python面向对象编程的提高【多继承、多态、类属性、动态添加与限制添加属性与方法、@property】
一.多继承 案例1:小孩继承自爸爸,妈妈.在程序入口模块再创建实例调用执行 #father模块 class Father(object): def __init__(self,money): self ...
- Java自学-类和对象 类属性
Java的类属性和对象属性 当一个属性被static修饰的时候,就叫做类属性,又叫做静态属性 当一个属性被声明成类属性,那么所有的对象,都共享一个值 与对象属性对比: 不同对象的 对象属性 的值都可能 ...
- 【python系统学习13】类(class)与对象(object)
目录: 类(class)和实例 类 实例 小测试 对象(object) 属性和方法 类的创建 伪代码 示例代码 属性(attribute) 方法(method) 类的实例化 实例对象调用类属性和方法 ...
- python-类属性和对象属性(转)
class People(object): # 类属性是指定义在类的内部而且在方法的外部的属性 money = 10000 def __init__(self,name,age,gender=1): ...
- Python中的类属性、实例属性与类方法、静态方法
1.什么是类对象,实例对象 类对象:类名 实例对象:类创建的对象 2.类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,这个和C++.Java中类的静态成员变量有点 ...
- python类属性和实例属性(类变量和实例变量)
在类中,根据变量定义的位置不同,以及定义的方式不同,类属性又可以细分为以下三种类型: 类体中,所有函数之外:类属性(类变量) 类体中,所有函数内部,以"self.变量名"的方式定义 ...
随机推荐
- 使用js拆分带参数的URL,将参数分离出来
url中的内容www.XXXX.com?content=123; 一下为js内容,包装在一个init方法中. init(); function init(){ var theRequest = new ...
- nginx缓冲区,跳转,超时
缓冲区 nginx服务器向后台转发请求的时候, 往往只收到一下部分请求头的信息,缓冲区的意义在于尽可能多的保存请求信息. 语法配置 proxy _buffering打开后---设置为on,浏览器里面将 ...
- monkey test——学习资料
出处: http://www.testwo.com/blog/6107 http://www.testwo.com/blog/6146 http://www.testwo.com/blog/6188 ...
- 路由器配置——单臂路由实现VLAN间通信
一.实验目的:用路由器使同和不同vlan可以通信 二.拓扑图如下: 三.具体步骤: (1)R1路由器配置: Router>en --进入特权模式Router#conf t --进入全局配置模 ...
- 数位dp入门(内容一样,新版格式)
顾名思义,数位dp,是一种用来计数的dp,就是把一个数字拆成一个一个数位去统计 如果现在给你一道题,需要你求在区间[l,r]内满足条件的解的个数,我们很容易想到去暴力枚举,但要是数据范围太大这种办法就 ...
- go之流程控制
一.与用户交互 var name string fmt.Scanln(&name) # 一定得传指针,因为我要修改的是name的值 fmt.Println(name) 二.if判断 1.if ...
- 认识并安装RabbitMQ(以Windows系统为例)
一.初识RabbitMQ 百度百科有这么一句话: MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息, 而另一端则可以读取或者订阅队列中的消息. MQ和JMS类似,但不同的是JMS是 ...
- 邻居子系统 之 更新neigh_update
概述 neigh_update函数用来更新指定的邻居项,更新内容是硬件地址和状态,更新之后,会根据新状态设置其输出函数,CONNECTED状态则使用快速输出,否则使用慢速输出:如果是由原来的无效状态变 ...
- R语言:时间的转化
一般使用R从数据库导出来的时间数据一般都不是我们能看的懂的(具体是什么格式的我也忘记了),需要做如下转化 as.Date(time,origin = '1970-01-01') 最近从网上爬下来的时间 ...
- koa 基础(二十二)封装 DB 库 --- 测试
1.根目录/module/config.js /** * 配置文件 */ var app = { dbUrl: 'mongodb://127.0.0.1:27017/?gssapiServiceNam ...