Day8 面向对象(补充)

私有字段

class Foo:

def __init__(self, name):        self.__name = name

def f1(self):        print(self.__name)

class Bar(Foo):    def f2(self):        print(self.__name)

obj = Foo(‘alex‘)#print(obj.name)#只能内部调用obj.f1()

obj2 = Bar(‘aaa‘)obj2.f1()#私有普通字段只有自己能访问,其余均不行obj2.f2()

静态方法

class Foo:

__cc = ‘123‘    def __init__(self, name):        self.__name = name

def f1(self):        print(self.__name)

@staticmethod    def f2():        print(Foo.__cc)

# obj = Foo(‘aaa‘)# obj.f2()Foo.f2()

__getitem,__setitem,__delitem

class Foo:

def __init__(self, name):        self.__name = name

def f1(self):        print(self.__name)

def __getitem__(self, item):        print(type(item))        return 123

def __setitem__(self, key, value):        print(‘setitem‘)

def __delitem__(self, key):        print(‘del item‘)

obj = Foo(‘alex‘)#obj[]执行__getitem__方法#语法对应关系ret = obj[‘ad‘]print(ret)ret1 = obj[1:2]print(ret1)obj[‘k1‘] = 123del obj[‘k1‘]

切片

class Foo:

def __init__(self, name):        self.__name = name

def f1(self):        print(self.__name)

def __getitem__(self, item):        print(item, type(item))        print(item.start)        print(item.stop)        print(item.step)        return 123

def __setitem__(self, key, value):        #key.start  key.stop  key.step        print(type(key), type(value))

def __delitem__(self, key):        print(type(key))        # key.start  key.stop  key.step        print(‘del item‘)

obj = Foo(‘alex‘)#obj[]执行__getitem__方法#语法对应关系#ret = obj[‘ad‘]ret1 = obj[1:4:2]obj[1:4] = [11, 22, 33, 44, 55]del obj[1:4]

迭代器

class Foo:    def __iter__(self):        yield 1        yield 2

obj = Foo()for item in obj:    print(item)

#1.obj能被循环,必须被迭代#2.for循环执行时,默认执行__iter__方法

isinstance和issubclass

#isinstance:obj, Foo(obj类型和obj类型的父类)的实例#issubclass:是否子类class Foo:    pass

class Bar(Foo):    pass

obj = Bar()ret = isinstance(obj, Foo)print(ret)

ret2 = issubclass(Bar, Foo)print(ret2)

super

#假设有一大堆代码,现在需要增加功能,不改变原来代码结构的基础上,增加类#然后执行super方法,super主动去执行父类的方法class C1:    def f1(self):        print(‘c1.f1‘)

class C2(C1):    def f1(self):        #主动去执行父类的f1方法        super(C2, self).f1()        print(‘c2.f1‘)        #不建议使用该方法        #C1.f1(self)

obj = C2()obj.f1()

在不改变原有框架的基础上,增加方法

框架结构:
Test
    backend
           commons.py
    index.py
    lib.py(自己扩展类)
    settings.py
commons.py
class Foo:

def f1(self):        print(‘Foo.f1‘)
settings.py
# Path = ‘backend.commons‘# ClassName = ‘Foo‘

Path = ‘lib‘ClassName = ‘MyFoo‘
lib.py
from backend.commons import Foo

class MyFoo(Foo):    def f2(self):        print("before")        super(MyFoo, self).f1()        print("after")
index.py
from settings import ClassNamefrom settings import Path

def execute():    #print(ClassName)    #反射获取字符串    model = __import__(Path, fromlist=True)    cls = getattr(model, ClassName)    obj = cls()    obj.f2()

if __name__ == ‘__main__‘:    execute()
有序字典
class MyDict(dict):

def __init__(self):        self.li = []        super(MyDict, self).__init__()

def __setitem__(self, key, value):        self.li.append(key)        super(MyDict, self).__setitem__(key, value)

def __str__(self):        tmp_list = []        for key in self.li:            value = self.get(key)            tmp_list.append("‘%s‘:%s" % (key, value))        tmp_str = "{" + ",".join(tmp_list) + "}"        return tmp_str

obj = MyDict()obj[‘k1‘] = 123obj[‘k2‘] = 345print(obj)
 
时间: 2024-10-12 22:40:40

Day8 面向对象(补充)的相关文章

php面向对象补充

面向对象补充 __tostring的方法 class Ren{ public $name; public function __tostring(){ return "这是人类,有成员变量name代表名称"; } } $r = new Ren(); echo $r; 自动调用tostring方法. 克隆对象的方法 class Ren{    public $name;        public function __tostring(){        return "这是

Python 面向对象-------补充

Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程. 接下来我们先来简单的了解下面向对象的一些基本特征. 面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定

JavaSE入门学习24:Java面向对象补充

一Java中的Object类 Object类是所有Java类的父类,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认 继承Object类. public class Person{ // } //等价于 public class Person extends Object{ // } Object类中的方法,适合所有子类. 1)toString()方法 在Object类中定义有public String toString()方法,其返回值是String类型,描述当前对

python面向对象补充

如何使用类 一.实例化:创建对象 例子一 x=int(10) print(x) python中一切皆为对象,且python3统一了类与类型的概念,类型就是类 >>> dict #类型dict就是类dict <class 'dict'> >>> d=dict(name='egon') #实例化 >>> d.pop('name') #向d发一条消息,执行d的方法pop. 'egon' 例子二: class Garen: camp='Demaci

【Python学习之路】——Day8(面向对象进阶)

面向对象 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个"函数"供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数 面向对象三大特性:封装.继承和多态 介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其

Python之路,Day8 - 面向对象编程进阶

本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典类vs新式类 把下面代码用python2 和python3都执行一下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #_*_coding:utf-8_*_ class A:     def __init__(self):

python8之面向对象补充之使用场景

一.概述 之前我们学了面向对象知识,那我们在什么时候用呢?不可能什么时候都需要用面向对象吧,除非你是纯的面向对象语言,好的,我们下面就来谈谈 二.知识回顾 2.1 什么是面向对象? 在学面向对象之前我们都是用:函数 面向对象编程其实就是:类 + 对象 2.2 什么是类,什么是对象,它们之前又有什么关系? class 类名: def 函数1(): pass def 函数2(): pass # obj是对象,是一个实例化的 obj = 类名() obj.函数1() 三.使用场景 3.1 提取公共功能

13-2 面向对象补充

接口类 c# .java 都是面向对象编程的语言.在开发的过程中,有一种设计模式叫做接口. 接口类:python原生不支持 抽象类:python原生支持的 from abc import abstractmethod,ABCMeta class Payment(metaclas=ABCMeta): # 元类,默认的元类,type @abstractmethod def pay(self,money):pass #没有实现这个方法 规范:接口类或者抽象类都可以 接口类:支持多继承,接口类中的所有方

Day8 面向对象反射

反射:通过字符串来访问到所对应的值(反射到真实的属性上). eg: 1 class Foo: 2 x=1 3 def __init__(self,name): 4 self.name=name 5 6 def f1(self): 7 print('from f1') 8 9 10 # print(Foo.x) #Foo.__dict__['x'] 11 12 f=Foo('egon') 13 # print(f.__dict__) 14 # 15 # #1: 16 # print(f.name)