类的定义与实例化对象
对象 = 属性 + 方法 对象是类的实例,类的定义数据为属性,对数据的操作函数叫方法 _init_(self) 是类的构造函数,创建对象,也就是类实例化时自动执行,用于初始化类属性 self 表示自身,用于访问类中定义的属性或者方法
定义一个类名为Student,包含name,sag属性,还有输出name,age属性的函数print_student()函数,Student类的实例为对象zhangsan,lisi
class Student:
name = None
age = None
def __init__(self,name,age):
self.name = name
self.age = age
def print_student(self):
print("我的名字叫 %s 年龄为 %d 岁" % (self.name,self.age))
zhangsan = Student("张三",15)
zhangsan.print_student()
lisi = Student("李四",16)
lisi.print_student()
类属性与实例化属性
类Student2中属性name和age为类属性,也叫静态属性,是固有的,不可删除。Python中还可定义实例属性,也叫动态属性可以删除。
class Student2:
name = None
age = None
def __init__(self,name,age,sex = '男'): #定义一个实例属性性别
self.name = name
self.age = age
self.sex = sex
def print_student(self):
print("我的名字叫 %s 年龄为 %d 岁" % (self.name,self.age))
def print_sex(self):
print("我的名字叫 %s 性别为 %s" % (self.name,self.sex))
wangwu = Student2("王五",20,"男")
wangwu.print_student()
wangwu.print_sex()
maliu = Student2("马六",19,"女")
maliu.print_student()
maliu.print_sex()
del wangwu.sex #删除对象wangwu的属性sex所以王五不能在拥有sex属性,再次访问wangwu的sex时程序会抛出异常
wangwu.print_student()
maliu.print_student()
maliu.print_sex()
还可以在类定义结束和对象产生后动态添加实例属性
class Student3:
name = None
age = None
def __init__(self,name,age): #定义一个实例属性性别
self.name = name
self.age = age
def print_student(self):
print("我的名字叫 %s 年龄为 %d 岁" % (self.name,self.age))
def print_sex(self):
print("我的名字叫 %s 性别为 %s" % (self.name,self.sex))
Student3.sex = "男"
daer = Student2("大鹅",20,"男")
daer.print_student()
daer.print_sex()
xdaer = Student2("小鹅",19)
xdaer.sex = "女"
xdaer.print_student()
xdaer.print_sex()
del daer.sex #也可以删除
属性分装
Python中的属性可以直接访问
class Person:
name = None
age = None
def __init__(self,name,age):
self.name = name
self.age = age
zhao = Person("赵",20)
print('姓名为 %s 年龄为 %d' % (zhao.name,zhao.age))
zhao.age = 21
print('姓名为 %s 年龄为 %d' % (zhao.name,zhao.age))
面向对象编成中类定义的属性分装起来,不允许外部直接访问,若要访问只能通过类定义的方法进行。 在属性名前加两个下划线,可阻止外部对属性的直接访问
class Person2:
__name = None
__age = None
def __init__(self,name,age):
self.__name = name
self.__age = age
def set_name(self,name):
self.__name = name
def set_age(self,age):
self.__age = age
def get_name(self):
return self.__name
def get_age(self):
return self.__age
qian = Person2("钱",20)
qian.set_age(22)
print('姓名为 %s 年龄为 %d' % (qian.get_name(),qian.get_age()))
通过@property装饰符既可以分装类的属性,还可以简化访问形式
class Person3:
def __init__(self,name,age):
self.name = name
self.age = age
@property #在返回值属性前加@property
def name(self):
return self._name
@property
def age(self):
return self._age
@name.setter #再修改值属性前加@属性名.setter,且方法中属性名前加一个下划线
def name(self,name):
self._name = name
@age.setter
def age(self,age):
self._age = age
tan = Person3("谭", 22)
print("姓名为 %s 年龄为 %d" % (tan.name,tan.age))
类的继承
在定义新的类时可继承现有类的属性和方法。 新的类被称为子类,被继承的类被称为父类。如果定义的新类没有指向父类则父类默认为object,object是类继承的根
class Father:
__name = None
__age = None
def __init__(self,name,age):
self.__name = name
self.__age = age
def set_name(self,name):
self.__name = name
def set_age(self,age):
self.__age = age
def get_name(self):
return self.__name
def get_age(self):
return self.__age
class Son(Father):
__sex = None
def __init__(self,sex = '男',name = "NOname",age = 19):
super().__init__(name,age) #用super().__init__()调用父类的__int__()函数
self.__sex = sex
def set_sex(self,sex):
self.__sex = sex
def get_sex(self):
return self.__sex
my = Son("小白")
my.set_age(19)
my.set_sex("男")
my.set_name("小白")
print("name = %s age = %d sex = %s" % (my.get_name(),my.get_age(),my.get_sex()))
多态
多态就是将对象作为函数的形参,函数执行时将根据实际传人的对象实参执行相应的操作,可以实现给函数传人不同对象,得到不同结果的效果。进行多态编程时,要求作为参数的对象具有相同的接口。
class A:
__name = None
def __init__(self,name = 'noname'):
self.__name = name
def set_name(self,name):
self.__name = name
def get_name(self):
return self.__name
def who(self):
print("my name is %s" % self.__name)
class B(A):
__age = None
def __init__(self,name = 'noname',age = 0):
super().__init__(name)
self.__age = age
def set_age(self,age):
self.__age = age
def get_age(self):
return self.__age
def who(self):
print("my name is %s age is %d" % (super().get_name(),self.get_age()))
def whoareyou(xx):
xx.who()
s = A("杨")
q = B("谭", 22)
whoareyou(s)
whoareyou(q)
类中的BIF
(1) isinstance (对象,类),用于判断给出的对家是否为指定类的实例,子类的对象仍然判定为父类的实例。
(2) issubclass (类1,类2),用于判断“类1”是否为“类2”的子类。
(3) hasattr (类或者对象,属性或者方法),判断指定类或者对象是否具有指定的属性或者方法,其中属性或者方法表示成字符串形式且方法为不带括号的函数名。
(4) getattr (类或者对象,属性或者方法),获取指定类或者对象的属性或者方法,其中属性或者方法表示成字符串形式且方法为不带括号的函数名,通过 getattr ()函数,可以获得类或者对象的属性,或者运行对象的方法。
(5) setattr (类或者对象,属性,值),用于设置指定类或者对象的属性,其中属性表示成字符串形式,值按照实际类型给出,通过 setattr()函数,可以动态设置类或者对象的属性。