面向对象笔记

个人整理

面向对象:
1、定义:一种认识世界、分析世界的方法论。将万事万物抽象为类。
2、类class:类是抽象的概念,是一类事物的共同特征的集合。计算机语言指的就是属性和方法。
3、对象instance、object:对象是类的具象,是一个实体

python中,一个对象的特征也称为属性,它所具有的行为叫方法。
具有相同属性和方法的对象归为一个类。
类是对象的抽象化,对象是类的实例化,对象表示具体事物。

 

面向对象:对函数进行分类和封装。
面向过程:根据业务逻辑从上到下写垒代码
函数式:将某功能的代码封装到函数中,以后使用调用函数

类可以理解为一个模板,里面可以包含多个函数,函数里实现一些功能
对象是根据模板创建的实例,通过实例对象可以执行类中的函数。

class MyClass:
x = 123
class:关键字,表示要创建类
MyClass:类名称

def foo(self): self:特殊参数,必填
return ‘My Class’
print(MyClass.x)
print(MyClass.foo)
print(MyClass.__doc__)

对象是数据和操作的封装。

封装:
组装:将数据和操作组装到一起。
隐藏数据:对外暴露接口,通过接口访问对象。

继承:
多复用
多继承少修改

多态

类对象,类的定义会产生一个类对象
类属性:定义中的变量和定义的方法都是类的属性,也叫方法
类变量:x是类定义的一个变量

MyClass中,x、foo都是类的属性,__doc__也是类的属性
foo方法是类的属性

foo是method方法对象,不是普通的函数对象function了,它必须至少有一个参数,且第一个必须是self
self指代当前实例本身。

 

实例化
a = MyClass() #实例化,在类对象名称后面加上一个括号,即是调用类的实例化方法,完成实例化。
实例化就是真正创建一个该类的对象(实例)

实例化后获得的实例,是不同的实例,即使使用相同的参数实例化,也得到不一样的参数。
python类实例化后,会自动调用__init__方法,这个方法第一个参数必须留给self,其它随意。

 

MyClass()实际上调用的是__init__(self)方法,可以不定义,如果没有定义会在实例化后隐式调用

class MyClass:
def __init__(self):
print(‘init’)

a = MyClass() #会调用__init__

 

类属性:类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存一个副本
# 类属性
class people:
name=”Tom” #公有的类属性
__age=18 #私有的类属性

p=people() #实例化
print(p.name) #实例对象
print(people.name) #类对象

# print(p.__age) #错误 不能在类外通过实例对象访问私有的类属性
print(people.__age) #错误 不能在类外同过类对象访问私有的类属性

 

实例属性:
class people:
name=”tom”

p=people()
p.age=18

print(p.name)
print(p.age) #实例属性是实例对象特有的,类对象不能拥有

print(people.name)
#print(people.age) #错误:实例属性,不能通过类对象调用

也可以将实例属性放在构造方法中

class people:
name=”tom”
def __init__(self,age):
self.age=age

p=people(18)

print(p.name)
print(p.age) #实例属性是实例对象特有的,类对象不能拥有

print(people.name)
# print(people.age) #错误:实例属性,不能通过类对象调用

 

如果在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,
# 会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且如果通过
# 实例对象引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性

class Animal:
name=”Panda”

print(Animal.name) #类对象引用类属性
p=Animal()
print(p.name) #实例对象引用类属性时,会产生一个同名的实例属性
p.name=”dog” #修改的只是实例属性的,不会影响到类属性
print(p.name) #dog
print(Animal.name) #panda

# 删除实例属性
del p.name
print(p.name)

 

class Test:

num=100 #类属性
def __init__(self):
self.age=18 #实例属性

test1=Test()
test2=Test()
# test1.age=19
# test2.age=20
print(test1.num) #100
test1.num=200 #如果通过对象去修改类属性,那么Python会自动给这个对象和这个类属性相同名字的实例属性
print(test1.num) #200,只是修改了副本
print(Test.num) #100

del test1.num #删除之后,仍能打印
print(test1.num)

 

3、类方法

是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以’cls’作为第一个参数的名字,就最好用’cls’了),能够通过实例对象和类对象去访问。

class people:
country=”china”

@classmethod
def getCountry(cls):
return cls.country

p=people()
print(p.getCountry()) #实例对象调用类方法
print(people.getCountry()) #类对象调用类方法

 

类方法还有一个用途就是可以对类属性进行修改:
class people:
country=”china”

@classmethod
def getCountry(cls):
return cls.country
@classmethod
def setCountry(cls,country):
cls.country=country

p=people()
print(p.getCountry()) #实例对象调用类方法
print(people.getCountry()) #类对象调用类方法

p.setCountry(“Japan”)

print(p.getCountry())
print(people.getCountry())

 

 

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/88328

(0)
泰谷子泰谷子
上一篇 2017-11-12
下一篇 2017-11-12

相关推荐

  • Python内置数据结构——字符串

    知识结构图 学习笔记 字符串 字符组成的有序序列,字符的集合 使用单引号、双引号、三引号引起来的字符序列 不可变对象 Unicode类型 定义 单引号、双引号、三引号 r、R:引号内的字符原样输出 元素访问 索引访问 可迭代 join连接 “string“.join(iteratable) 使用string作为分隔符将可迭代对象连接起…

    2018-03-31
  • mysql慢查询日志进行按库切割重写文件然后分析

    需求: 把每天的慢查询日志进行按库切割 对每个库的慢查询日志进行分析 思路: 工具/功能 一般统计信息 高级统计信息 脚本 优势 mysqldumpslow 支持 不支持 perl mysql官方自带 mysqlsla 支持 支持 perl 功能强大,数据报表齐全,定制化能力强. mysql-explain-slow-log 支持 不支持 perl 无 my…

    Linux干货 2015-04-03
  • python学习总结

    第一个项目日志分析。(存在不足)

    Python笔记 2018-05-06
  • 装饰器

    装饰器 需求 一个加法函数,想增强它的功能,能够输出被调用过以及调用的参数信息 def add(x, y): return x + y 增加信息输出功能 def add(x, y): print(“call add, x + y”)  # 日志输出到控制台 return x + y p 上面的加法函数是完成了需求,但是有以下的缺点 打…

    Python笔记 2018-04-23
  • Python内置数据结构

    解析器和生成器

    Python笔记 2018-04-08
  • Python的安装

    安装Python 3还是2目前,Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的。由于3.x版越来越普及,3中的特性越来越要求企业用3来开发,所以更加推荐python3作为安装学习的版本。可以在哪些操作系统下安装python安装Python的平台因为Python是跨平台的,它可以运行在Windows、Mac和各种Linux/Uni…

    2017-09-18