page contents

Python程序员正经搞对象技巧梳理

本文讲述了python程序员正经搞对象技巧梳理!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

attachments-2023-12-olQTJsrv658bc45ec3693.jpg本文讲述了python程序员正经搞对象技巧梳理!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

面向对象技术简介

类: 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

class

类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。

数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。

方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖,也称为方法的重写。

实例变量:定义在方法中的变量,只作用于当前实例的类。

继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。

创建类

#!/usr/bin/env python

class Price(object):   #新式类,object类是所有类的基类/父类

    a = 0

    def __init__(self):    #构造函数,当实例化对象时自动调用

        self.price = 100    #属性

        self.count = 0.7

    def price(self):               #方法

        new_price = self.price * self.count

        return new_price

        print this is new_price   #构析函数,执行price方法时自动调用

p = Price()

print p.price

print p.a

a 变量是一个类变量,它的值将在这个类的所有实例之间共享。你可以在内部类或外部类使用 P 访问。

第一种方法__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法

self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。

self代表类的实例,而非类

类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。

输入:

#!/usr/bin/env python

# coding=utf-8

class Test:

    def a(self):    #self代表类的实例

        print(self)

        print (self.__class__)

t = Test()

t.a()

输出

/usr/bin/python2.7 /root/PycharmProjects/untitled/002.py

<__main__.Test instance at 0x7ff9267e84d0>

__main__.Test

Process finished with exit code 0

从执行结果可以很明显的看出,self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。

self 不是 python 关键字,我们把他换成 runoob 也是可以正常执行的:

创建实例对象

访问属性:可以使用点(.)来访问对象的属性。使用如下类的名称访问类变量:

class Price(object):

    a = 0

    def __init__(self):

        self.price = 100

        self.count = 0.7

    def price(self):

        new_price = self.price * self.count

        return new_price

p = Price()                     ##实例化过程

print p.price                  ##访问属性

print p.a

Python内置类属性

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

__doc__ :类的文档字符串

__name__: 类名

__module__:   类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)

__bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)

Python内置类属性调用实例如下:

#!/usr/bin/env python

# coding=utf-8

class Exam:

    hahahaha

    def __init__(self,name,salary):

        self.name = name

        self.salary = salary

        Exam.name = haha,hehe

print Exam.__doc__

print Exam.__dict__

print Exam.__module__

print Exam.__bases__

python对象销毁(垃圾回收)

Python 使用了引用计数这一简单技术来跟踪和回收垃圾。

在 Python 内部记录着所有使用中的对象各有多少引用。

一个内部跟踪变量,称为一个引用计数器。

当对象被创建时, 就创建了一个引用计数, 当这个对象不再需要时, 也就是说, 这个对象的引用计数变为0 时, 它被垃圾回收。但是回收不是立即的, 由解释器在适当的时机,将垃圾对象占用的内存空间回收。

a = 40      # 创建对象  <40>

b = a       # 增加引用, <40> 的计数

c = [b]     # 增加引用.  <40> 的计数

del a       # 减少引用 <40> 的计数

b = 100     # 减少引用 <40> 的计数

c[0] = -1   # 减少引用 <40> 的计数

垃圾回收机制不仅针对引用计数为0的对象,同样也可以处理循环引用的情况。循环引用指的是,两个对象相互引用,但是没有其他变量引用他们。这种情况 下,仅使用引用计数是不够的。Python 的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器。作为引用计数的补充, 垃圾收集器也会留心被分配的总量很大(及未通过引用计数销毁的那些)的对象。在这种情况下, 解释器会暂停下来, 试图清理所有未引用的循环。

类的继承

面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。

需要注意的地方:继承语法   class 派生类名(基类名):基类名写在括号里,基本类是在类定义的时候,在元组之中指明的。

在python中继承中的一些特点:

1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。

2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数

3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。

如果在继承元组中列了一个以上的类,那么它就被称作多重继承 。

输入

#!/usr/bin/env python

# coding=utf-8

class Father:

    a = 100

    def __init__(self):

        print i am  father

    def fatherMethod(self):

        print i am fatherMethod 

    def setfa(self):

        Father.fatherMethod()

class Son(Father):

    def __init__(self):

        print i am son

    def sonMethod(self):

        print i am sonMethod

s = Son()

s.fatherMethod()

s.sonMethod()

输出:

i am son

i am fatherMethod

i am sonMethod

也可以继承多个类:

class C(A, B):   # 继承类 A 和 B

调用方法重写

输入:

#!/usr/bin/env python

# coding=utf-8

class Father:

    a = 100

    def __init__(self):

        print i am  father

    def fatherMethod(self):

        print i am fatherMethod 

class Son(Father):

    def  fatherMethod(self):

        print i am big boy

s = Son()

s.fatherMethod()

输出:

i am  father

i am big boy

类属性与方法

类的私有属性

__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。

类的方法

在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数

类的私有方法

__private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用 self.__private_methods

输入:

class Father:

    a = 100      #公开变量  

     __haha = 0 #私有变量    

     def __init__(self):

        print i am  father

    def fatherMethod(self):

        print i am fatherMethod 

class Son:

    def  fatherMethod(self):

        print i am big boy

s = Son()

s.fatherMethod()

Son.__haha()   ##报错

输出:

Traceback (most recent call last):

  File /root/PycharmProjects/untitled/004.py, line 16, in <module>

    Son.__haha()

AttributeError: class Son has no attribute '__haha'

单下划线、双下划线、头尾双下划线说明:

__foo__: 定义的是特列方法,类似 __init__() 之类的。

_foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *

__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。

更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg


  • 发表于 2023-12-27 14:30
  • 阅读 ( 173 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
轩辕小不懂
轩辕小不懂

2403 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1316 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章