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) 返回对象的类型