第15次全天课笔记 20181104 面向对象编程

全天课笔记 20181104

 

第一道题,写一个包,里面实现一个模块

模块里面有个类,类有两个实例方法,一个方法可以统计某个路径文件的英文个数,一个是统计空白字符个数,再实现以下调用类的逻辑。

 

//string_count.py的内容

 

class Count(object):

    def __init__(self,file_path):  
        self.file_path =file_path  #file_path 是实例变量

    def count_letter_num(self):
        letter_num = 0
        try:
            with open(self.file_path,encoding="utf-8") as fp:
                for line in fp:
                    for letter in line:
                        if (letter >="a" and letter <="z") or (letter >="A" and letter <="Z"):
                            letter_num +=1
            return letter_num
        except IOError as e:
            print(e)
            return None

    def count_space_num(self):
        space_num = 0
        try:
            with open(self.file_path,encoding="utf-8") as fp:
                for line in fp:
                    for letter in line:
                        if letter.isspace():
                            space_num +=1
            return space_num
        except IOError as e:
            print(e)
            return None

 

调用的实现

//a.py

 

import count.string_count  #包名.模块名

 

file1 = count.string_count.Count("D:\\up\\0826\\test1.py")   #包名.模块名.类名

print(file1.count_letter_num())

print(file1.count_space_num())

 

第二题: 统计一下两个句子中不重复单词数量,并列出哪些单词出现了重复值

import string

s1 = "I am a boy, good boy!"
s2 = "I am not a boy, good girl"

for i in string.punctuation:
    s1 = s1.replace(i," ")
    s2 = s2.replace(i," ")
 
wordlist1 = set(s1.split())
wordlist2 = set(s2.split())

print(wordlist1)
print(wordlist2)

print(list(wordlist1^wordlist2))
print(len(list(wordlist1^wordlist2)))  #使用异或,不相同的

print(list(wordlist1&wordlist2))  #使用并集
print(len(list(wordlist1&wordlist2)))

 

Subscriptable  切片

 

 

>>> class P:

...     def print_info():pass    #实例方法必须有self

...     def print_str(self):

...         print("P")

...

>>> p=P()

>>> p.print_info()

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: print_info() takes 0 positional arguments but 1 was given  #因为self

>>> p.print_str()

P

 

>>> class P:

...     def print_str(self):

...         print("P")

...     def func(self):

...         self.print_str()   #实例方法是互相可以调用的

...

>>> p=P()

>>> p.func()

P

实现加减乘除方法

class ComputeTwoNumbers(object):

    def __init__(self,a,b):
        self.a = a
        self.b = b

    def sum(self):
        return self.a + self.b

    def sub(self):
        return self.a - self.b

    def mul(self):
        return self.a * self.b

    def div(self):
        return self.a /self.b


jisuan = ComputeTwoNumbers(3,5)
print(jisuan.sum())
print(jisuan.sub())
print(jisuan.mul())
print(jisuan.div())

 

类成员

方法:普通方法、类方法、静态方法

 

类方法

>>> class P:

...     @classmethod     #装饰器

...     def print_str(cls,content):     #cls必须的

...         print(content)

...

>>> P.print_str("hello")    #类直接调用可以

hello

>>> p=P()

>>> p.print_str("hi")      #实例化之后调用也可以

hi

 

面试准备:

1. 功能准备

所有用例的设计方法,测试框架,bug预防,探索式测试

2. 编程

算法:冒泡、快排、二分查找法、链表、二叉树的深度遍历和广度遍历、递归

字符串相关的面试题

3. Http协议

Get和post区别,http和https的区别,http的各种状态码,http请求或者响应包的一些机构:头、body

4. IOS七层模型

Ip tcp http https

操作系统:线程和进程的区别,多进程,多线程,协程

5. 设计模式

单例模式,工厂模式,MVC模式

6. 原理: webdriver的原理,spring boot的原理,spring的原理

Jvm的理解: 内容泄露和内存溢出,垃圾回收,虚拟机的一些区

7.Linux:

   常见的30命令,看cpu、内存、IO、日志、看网络

   Linux安装软件: rpm和源码

   Shell编程,awk,sed

8. 数据库

Sql:多表查询、子查询、更新,索引的知识,慢查询:slow query

执行计划,存储引擎的特点,行锁,表锁

9. 架构

公司的产品架构怎么实现

10.自动化

设计模式:数据驱动,关键字驱动,混合驱动

元素+动作+操作值

11.性能 

12.安全

13. 价值和软技能:项目贡献,学习能力,表达能力,主动性,流程的优化和改进,质量度量

 

静态方法

>>> class P:

...     @staticmethod        #staticmethod 静态方法

...     def print_str(content):

...         print(content)

...

>>> P.print_str("hi")     #类直接调用

hi

>>> p=P()             #实例方法也可以调用

>>> p.print_str("hello")

Hello

 

普通方法:由对象调用,至少一个self参数,执行时自动将调用该方法的对象赋值给self

类方法:由类调用,至少一个cls参数,执行时自动将调用该方法的类赋值给cls

静态方法:由类调用,无默认参数

 

class ComputeTwoNumbers(object):

    count = 0   #类变量

    def __init__(self,a,b):    #构造函数
        self.a = a
        self.b = b

    def sum(self):             #实例方法
        ComputeTwoNumbers.count+=1
        return self.a + self.b
         
    @classmethod
    def sub(cls,a,b):          #类方法   
        ComputeTwoNumbers.count+=1
        return a-b
   
    @staticmethod              #静态方法
    def mul(a,b):
        ComputeTwoNumbers.count+=1
        return a*b

    def div(self):
        ComputeTwoNumbers.count+=1
        return self.a /self.b
 
jisuan = ComputeTwoNumbers(3,5)
print(jisuan.sum())
print(jisuan.div())
#print(jisuan.sub(5,2))
print(ComputeTwoNumbers.sub(5,2))
print(jisuan.mul(5,5))
print(ComputeTwoNumbers.mul(5,5))
print(ComputeTwoNumbers.count)

 

@property 的使用

class Foo:

    def __init__(self,value):

        self.value = value

 

    def func(self):

        print("func!")

 

    @property

    def prop(self):

        return self.value*123

 

foo_obj = Foo(100)

foo_obj.func()

print(foo_obj.prop)    #调用属性,不用加括号

C:\Users\Xue Feifei>py -3 D:\up\1104\a.py

func!

12300

 

 

class Goods(object):

 

    def __init__(self):

        self.value = 1

   

    @property          #动态生成属性值

    def price(self):

        print("######@property")

        return self.value

 

    @price.setter        #设定赋值的规则

    def price(self,value):

        self.value = value

        print("@price.setter")

 

    @price.deleter       #做清理

    def price(self):

        del self.value

        print("@price.deleter")

 

obj = Goods()

print(obj.price)

obj.price = 123

print(obj.price)

del obj.price

print(obj.price)

 

私有变量 __value  加两个下划线

 

使用函数添加、删除、修改、访问类属性

可以使用以下函数来操作对象的属性:

1、getattr(obj, name[, default]) : 访问对象的属性,如果存在返回对象属性的值,

否则抛出AttributeError异常。

2、hasattr(obj,name) : 检查是否存在某个属性,存在返回True,否则返回False。

3、setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属

性,该函数无返回值。若存在则更新这个值

4、delattr(obj, name) : 删除属性,如果属性不存在则抛出AttributeError异常,

该函数也无返回值。

 

>>> class P:

...     def __init__(self,gender):

...         self.gender =  gender

...     def get_gender(self):

...         print(self.gender)

...

>>> p=P("Female")

>>> p.gender            #获取属性值

'Female'

>>> getattr(p,"gender")    #获取属性值

'Female'

 

>>> getattr(p,"gender1")    #当属性值没有的时候,抛出AttributeError异常

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'P' object has no attribute 'gender1'

>>> getattr(p,"gender1","hello")   #可以返回一个默认值,并不是赋值

'hello'

 

>>> setattr(p,"salary",100)  #设置属性

>>> getattr(p,"salary")

100

 

>>> delattr(p,"salary")

>>> p.salary

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

AttributeError: 'P' object has no attribute 'salary'

 

Python内置类属性

Python有如下内置的类属性:

__dict__ : 类的属性(包含一个字典,由类的数据属性组成)

__doc__ :类的文档字符串,也就是类的帮助信息。

__name__: 类名

__module__: 类定义所在的模块(类的全名是’__main__’,如果类位于一个

导入模块mymod中,那么className.__module__ 等于 mymod)

__bases__ : 类的所有父类(包含了所有父类组成的元组)

 

>>> class P:

...     a=100

...     def __init__(self,value):

...         self.value =  value

...     def print_str(self):

...         print(self.value)

...

>>> p =P(30)

>>> P.__dict__      #类

mappingproxy({'__module__': '__main__', 'a': 100, '__init__': <function P.__init

__ at 0x00000000024DA9D8>, 'print_str': <function P.print_str at 0x00000000024DA

AE8>, '__dict__': <attribute '__dict__' of 'P' objects>, '__weakref__': <attribu

te '__weakref__' of 'P' objects>, '__doc__': None})

>>> p.__dict__     #实例对象

{'value': 30}

 

>>> P.__name__

'P'

 

>>> P.__module__

'__main__'

 

>>> import os

>>> os.getcwd()   #获取当前工作路径

'C:\\Users\\Xue Feifei'

 

>>> P.__base__

<class 'object'>

 

类的私有属性

class Person(object):

    __secretCount = 0

    def __init__(self,name):

        self.name = name

        self.__inName = "ads"

 

    def visit_private_attribute(self):

        Person.__secretCount += 1

        print("__secretCount:",Person.__secretCount)

        print("__inName:",self.__inName)

 

p=Person("perl")

p.visit_private_attribute()

print("在类外直接通过实例访问私有属性")

print(p.__inName)

 

 

虽然Python不允许实例化的类从外部访问私有数据,但我们可以使用 object._className__attrName 访问私有属性

可以使用如下方法访问私有属性

class Person(object):

    __secretCount = 0

    def __init__(self,name):

        self.name = name

        self.__inName = "ads"

 

    def visit_private_attribute(self):

        Person.__secretCount += 1

        print("__secretCount:",Person.__secretCount)

        print("__inName:",self.__inName)

 

p=Person("perl")

p.visit_private_attribute()

print("使用另外一种方法访问私有属性")

print(p._Person__secretCount)    #一个下划线+类名+两个下划线+私有变量

print(p._Person__inName)

 

私有方法

类中方法名前面有两个下划线,表示是Python中的私有方法,类似于java中的private,不能在类外部调用(如__setId()),在类内部调用语法: self.__private_methods。

 

class Person(object):

    id = 12 #类静态成员在这儿定义,注意缩进

    def __init__(self,name):
        self.name = name
        self.__inName = "ads"

    def __setId(self,id): #隐藏方法
        Person.id = id * 2

    def getId(self):
        self.__setId(18) #类内部调用隐藏方法
        return Person.id

p = Person("prel")
print(p.getId())
print("类外部调用私有方法")
print(p.__setId(10))

 

 

继承

class P(object):

    a = 100

    def print_str(self,content):

        print(content)

 

class Q(P):

    b = 200

    def print_content(self,content):

        print(content)

 

q= Q()

print(q.a)

q.print_str("hi")

 

print(q.b)

q.print_content("hello")

 

 

class Bird(object):

    def __init__(self,name,sound):

        self.name = name

        self.sound = sound

    def get_name(self):

        print(self.name)

    def get_sound(self):

        print(self.sound)

 

class Seagull(Bird):

    def __init__(self,name,sound,location):

        Bird.__init__(self,name,sound)    #需要将父类写一下

        self.location = location

    def get_location(self):

        print(self.location)

 

s = Seagull("huahua","gugu","qingdao")

s.get_name()

s.get_sound()

s.get_location()

子类调用父类的方法有两种:

  1. Parent.parentMethod(self)
  2. Self.parentMethod()

 

调用父类的_init__方法:(一般用第二种方法)

1、super(subclassName, self).__init__( [parameter1[,parameter2....]])

2、superclassName.__init__(self, [parameter1[,parameter2....]])

 

posted @ 2018-11-30 15:47  feifei_tian  阅读(116)  评论(0编辑  收藏  举报