Python——类的定义和超类

假定你已经学习了Java程序设计,那么就不难理解面向对象程序设计。在面向对象中,有几个非常重要的概念,包括:抽象、封装、继承、多态、方法重载等,不管怎样这些概念都与类相关。在Python中同样有同Java一样的类,用户可以根据设计需要对事物进行抽象,抽取主要的特征来构造需要的类并定义属于类的成员方法。
一、类的定义

# _*_ coding:utf-8 _*_
__metaclass__=type
class Person:
    def setName(self,name):
        self.name=name
    def getName(self):
        return self.name
    def greet(self):
        print('Hello,%s' %self.name)

运算结果:
=========RESTART: C:\Users\Mr_Deng\Desktop\test.py=========
>>> test1=Person()
>>> test1.setName('Jack Chen')
>>> print(test1.getName())
Jack Chen
>>> 

注:self参数是对对象自身的引用,在调用类中的定义的方法时,例如setName函数时,test1自动将自己作为第一个参数传入函数中。没有self变量,成员方法就不能设法访问他们要对其特性进行操作的对象本身了。
二、特性、函数和方法
2.1 self参数时方法和函数的区别,方法将他的第一个参数绑定到所属的实例上,但是这个参数也可以不提供,所以可以将特性绑定到普通函数上,这样就可以消除self参数

# _*_ coding:utf-8 _*_
__metaclass__=type
class Test:
    def A(self):
        print('self')


#另外定义一个函数
def fun():
    print('other function')

运算结果:
=========RESTART: C:\Users\Mr_Deng\Desktop\test.py=========
>>> test=Test()
>>> test.A()
self
>>> test.A=fun
>>> test.A()
other function
>>> 

但是,self参数并不取决于调用方法的方式,上例中采用实例调用的方式,但是实际上也可以引用同一方法的其他变量

# _*_ coding:utf-8 _*_
__metaclass__=type
class Test:
    s='test class'
    def outTest(self):
        print(self.s)

运算结果:
=========RESTART: C:\Users\Mr_Deng\Desktop\test.py=========
>>> test=Test()
>>> test.outTest()
test class
>>> x=test.outTest
>>> x()
test class
>>> 

注:这个例子中的方法调用于前面一个函数调用比较想死,但是x是引用绑定了Test中的方法outTest,也就是说x还是对self参数的访问。
2.2 方法私有化:在Python中若是想让某个方法或者特性变为私有的,在方法的名字前加上双下划綫即可

# _*_ coding:utf-8 _*_
__metaclass__=type
class Test:
    def A(self):
        print('public method')
    def __B(self):
        print('private methon')

运算结果:
=========RESTART: C:\Users\Mr_Deng\Desktop\test.py=========
>>> test=Test()
>>> test.A()
public method
>>> test.B()
Traceback (most recent call last):
  File "<pyshell#92>", line 1, in <module>
    test.B()
AttributeError: 'Test' object has no attribute 'B'
>>> 

三、类的命名空间:位于class语句中的代码都在特殊的命名空间中执行,这个空间就是类命名空间,该命名空间可以由类内所有的成员访问

# _*_ coding:utf-8 _*_
__metaclass__=type
class Member:
    count=0;
    def init(self):
        Member.count+=1

运算结果:
=========RESTART: C:\Users\Mr_Deng\Desktop\test.py=========
>>> test1=Member()
>>> test1.init()
>>> Member.count
1
>>> test2=Member()
>>> test2.init()
>>> Member.count
2
>>> test1.count
2
>>> test2.count
2
>>> 

四、指定超类:子类可以扩展超类的定义,将其他类名写在class语句后的圆括号内可以指定超类,案例如下:

# _*_ coding:utf-8 _*_
__metaclass__=type
class Filter:
    def init(self):
        self.blocked=[]
    def filter(self,seq):
        return [ x for x in seq if x not in self.blocked]

class ExtendFilter(Filter):
    def init(self):
        self.blocked=['1']

运算结果:
=========RESTART: C:\Users\Mr_Deng\Desktop\test.py=========
>>> f=Filter()
>>> f.init()
>>> f.filter([])
[]
>>> ef=ExtendFilter()
>>> ef.init()
>>> ef.filter(['1','2','3','1','1','7'])
['2', '3', '7']
>>> 

在ExtendFilter类中,继承了Filter中的filter方法
五、调查继承性
5.1 查看一个类是否是另一个类的子类,可以使用內建的函数issubclass

# _*_ coding:utf-8 _*_
__metaclass__=type
class Filter:
    def init(self):
        self.blocked=[]
    def filter(self,seq):
        return [ x for x in seq if x not in self.blocked]

class ExtendFilter(Filter):
    def init(self):
        self.blocked=['1'] 

运算结果:
=========RESTART: C:\Users\Mr_Deng\Desktop\test.py=========
>>> issubclass(ExtendFilter,Filter)
True
>>> 

或者使用bases

>>> ExtendFilter.__bases__
(<class '__main__.Filter'>,)
>>> 

5.2 检查一个对象是否是一个类的实例

>>> ef=ExtendFilter()
>>> isinstance(ef,ExtendFilter)
True
>>> 

5.3 查看一个对象属于哪个类

>>> ef.__class__
<class '__main__.ExtendFilter'>
>>> 

六、多个超类

# _*_ coding:utf-8 _*_
__metaclass__=type
class Cauculator:
    def cauculator(self,express):
        self.value=eval(express)

class Result:
    def result(self):
        print('result is :',self.value)

class Compute(Cauculator,Result):
    pass

运算结果:
=========RESTART: C:\Users\Mr_Deng\Desktop\test.py=========
>>> test=Compute()
>>> test.cauculator('12*2+2')
>>> test.result()
result is : 26
>>> 
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,一个可以从另一个中继承属性和方法。被继承的称为超类,继承属性的称为子。子可以继承超类的所有属性和方法,并且还可以重写超类的方法或添加新的属性和方法。要实现继承,只需在子class语句中将超类作为参数传递即可。例如,class SecondClass(FirstClass)表示SecondClass是FirstClass的子,继承了FirstClass的属性和方法。 通过继承,子可以使用和修改超类的属性和方法。子可以截获Python运算符,对树进行独立搜索,并且可以对实例、和self参数进行引用。例如,通过重写超类的方法,可以改变方法的行为,并且可以通过创建子来进行逻辑修改,而不是直接修改超类。在子的方法中,可以使用self.attr表达式来引用子超类的属性,该表达式将开启对self及其上层的的attr属性的搜索。 在Python中,超类之间的关系提供了一种灵活且强大的方式来组织和重用代码。使用继承机制,我们可以构建更复杂和可扩展的程序结构,并且可以轻松地添加新的功能或修改现有的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python中的的理解(一)](https://blog.csdn.net/zan1763921822/article/details/113481637)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值