面向对象笔记

个人整理

面向对象:
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

相关推荐

  • ss

    sas

    Python笔记 2018-05-10
  • PYTHON类型注解

    PYTHON类型注解 函数定义的弊端 Python是动态语言,变量随时可以被赋值,且能赋值为不同的类型 Python不是静态编译型语言,变量类型是在运行器决定的 动态语言很灵活,但是这种特性也是弊端 def add(x, y):return x + yprint(add(4, 5))print(add(‘hello’, ‘…

    Python笔记 2018-05-02
  • Python学习第十三周总结

    网络协议和管理、http服务和Apache

    2018-06-03
  • python内置数据结构

    python内置数据结构 sort(key=none,resverse=false)—>none 对列表元素进行排序,就地修改。默认升序 resvers为true,反转,降序 key为一个函数,指定key如何排序 ls.sort(key=functionaame) Print(lst.sort(key=str,reverse=Ture) I…

    Python笔记 2018-03-31
  • Python线程指南

    本文介绍了Python对于线程的支持,包括“学会”多线程编程需要掌握的基础以及Python两个线程标准库的完整介绍及使用示例。 注意:本文基于Python2.4完成,;如果看到不明白的词汇请记得百度谷歌或维基,whatever。 尊重作者的劳动,转载请注明作者及原文地址 >.< 1. 线程基础 1.1. 线程状态 线程有5种状态,状态转换的过程如…

    2015-03-13