第六章 类

1 创建类

__metaclass__ = type # 如果你使用的是Python 2,请包含这行代码

class stu:

    def setName(my,xage):
        my.name=xage
    def getName(my):
        return my.name
    def info(my):
        print("我是{}".format(my.name))

创建类对象并调用
s=stu();
s.setName('李师师')
s.info()

2 类的属性、函数和方法

方法和函数的区别在于类中的方法第一个参数关联到所属的 对象实例上,通过对象调用无需指定,

但是普通函数是不行的;

例 使用变量关联对象中的方法

class stu:
    xname='张三'
    def info(self):
        print(self.xname)


s=stu()
x=s.info

x()

3 类的封装

python没有提供私有关键字,可以在属性或方法名称前加入双下划线(__),这样外部便不能直接访问;

在编译过程中对这样的属性或方法进行如下转换,即在开头加上一个下划线和类名。

4 类的命名空间

类中的代码在一个特殊的命名空间(类的命名空间)内执行,类的所有成员都可以访问这个命名空间,类定义

就是要执行的代码段。

例 使用类变量

class stu:
    age=0
    def addAge(self):
        stu.age+=3
    def getAge(self):
        return stu.age

s=stu()
s.addAge()


s2=stu()
s2.addAge()


s3=s.getAge()
print(s3)

结果:6

5 类的继承

子类继承父类使用,类名后添加小括号的方式

class one:
    xage=8
    def init(self):
        print("init one...")
    def say(self):
        self.xage+=1
        print(f"one xage:{self.xage}")
class two(one):
    def init(self):
        print("two init...")
    def hello(self):
        print("two xage:{}".format(self.xage))
x=one()
x.init()
y=two()
y.init()
y.say()
y.hello()

6 判断类

python提供了判断类类型的方法

1) #判断two类的父类是否one类,注意必须判断类名

b=issubclass(two,one)

2) cname1=one.__bases__
cname2=two.__bases__

print(cname1,cname2)

输出:(<class 'object'>,) (<class '__main__.one'>,)

3) 判断一个对象是否属于一个类

b=isinstance(y,object)

print(b)

4) 得到类的基本信息:

c=y.__class__

7 python的多重继承

class one:
    def ok(self):
        print("one ok...")

class two:
    def ok(self):
        print("two ok....")

class three(one,two):
    pass

t=three()

t.ok()

输出:one ok

注意:如果多个超类以不同的方式实现了同一个方法(即有多个同名方法),必须在class语句中小心排列这些超类,因为位于前面的类的方法将覆盖位于后面的类的方法。

8 类对象的内省

python提供了hasattr(), setattr(),getattr()函数类对象的属性进行分析设置

class stu:
    xage=8
    xname='李四'

s=stu()
s.xname='张三'
print(s.xname)
b=hasattr(s,'xname')
print(b)
setattr(s,'xage',99)
xage=getattr(s,'xage',None)

print(xage)

9 抽象类

Python通过引入模块abc提供了所谓的抽象基类。一般而言,抽象类是不能(至少是不应该)实例化的类,其职责是定义子类应实现的一组抽象方法。
使用@abstractmethod来将方法标记为抽象的——在子类中必须实现的方法。

from abc import ABC,abstractmethod
class myabs(ABC):
    @abstractmethod
    def ok(self):

        pass

总结:类相关函数

callable(object) 判断对象是否是可调用的(如是否是函数或方法)
getattr(object,name[,default]) 获取属性的值,还可提供默认值
hasattr(object, name) 确定对象是否有指定的属性
isinstance(object, class) 确定对象是否是指定类的实例
issubclass(A, B) 确定A是否是B的子类
random.choice(sequence) 从一个非空序列中随机地选择一个元素
setattr(object, name, value) 将对象的指定属性设置为指定的值
type(object) 返回对象的类型

猜你喜欢

转载自blog.csdn.net/wshsdm/article/details/80188448