Python中类、对象和继承相关知识
定义类并创建对象
在Python中定义类的写法为:class 类名:
即可定义出一个类(注意:类名首字母大写)
由类创建对象的写法为变量名 = 类名()
Python中的属性
Python中的属性可分为两类:
1.类属性:由类来维护的属性,对象在访问这种属性时,访问的是同一个值(即,对象的共有财产)
2.实例属性:通过类创建出来的对象拥有,每个对象都维护自己独有的属性
可以将类属性理解为公有属性,实例属性理解为私有属性
类属性写法:直接在类中添加属性名和属性值
class Student:
country = 'china' # 类属性
stu1 = Student()
实例属性写法:实例属性定义在__init__
函数里面,且该函数接收的第一个参数(一般写为self
)是指针类型且永远指向该类创建出来的某个对象(即,通过类创建对象的时候,指针指向就确定了),函数接收的其它参数为创建对象时所需的形参
class Student:
country = 'china'
def __init__(self, name, age):
self._name = name # 实例属性_name
self._age = age # 实例属性_age
stu1 = Student('李四', '18')
__init__
函数在调用类创建对象过程中会自行调用执行,不需要手动调用__init__
函数
Python中的方法
Python中的方法可分为三类:
1.类方法:属于类的方法,由类来维护(对象的公有财产)
2.实例方法:属于对象的方法,由对象自己维护的方法(对象的私有财产)
3.静态方法:函数占据了类的命名空间,调用时需要通过类名+方法名才能调用。静态方法和通过该方法创建出来的对象没有任何关系
可以将类方法理解为公有方法,实例方法为私有方法
只有是没有调用过类、对象下的属性,就可以声明为静态方法
类方法的写法:通过系统装饰器@classmethod
声明函数为类方法,且该函数接收的第一个参数(一般写为cls
)是指针类型,指向的是类本身,类方法只能访问类属性,不能访问实例属性。函数接收的其它参数为创建对象时所需的形参
@classmethod
def say(cls):
print('我来自:' + cls.country)
# print('我来自:' + cls._age)
# 报错:AttributeError: type object 'Student' has no attribute '_age'
stu1.say() # 我来自:china
实例方法的写法:直接在类里添加函数,不需要装饰器修饰,其它写法和类方法一样,第一个参数一般写为self
用以区分。实例方法既访问类属性,也能访问实例属性
def hello(self):
print('我的祖国是:' + self.country)
print('我叫:' + self._name)
stu1.hello() # 我的祖国是:china 我叫:李四
静态方法的写法:通过系统装饰器@staticmethod
声明函数为类方法
@staticmethod
def soy():
print('我是打酱油的')
Student.soy() # 我是打酱油的
创建一个简单的类
class Student:
country = 'china'
def __init__(self, name, age):
self._name = name
self._age = age
@classmethod
def say(cls):
print('我来自:' + cls.country)
def hello(self):
print('我的祖国是:' + self.country)
print('我叫:' + self._name)
@staticmethod
def soy():
print('我是打酱油的')
stu1 = Student('李四', '18')
stu1.say()
stu1.hello()
Student.soy()
特性:property
特性作用及写法
作用:如果调用特性,则用户只能访问,不能设置;隐藏真实的实例属性,防止用户乱更改或误操作
写法:通过系统装饰器@property
声明函数
class Circle:
def __init__(self, r):
self._r = r
@property
def r(self):
return self._r
cir = Circle(10);
print(cir.r)
设置器作用及用法
作用:专门提供给特性使用,用来修改特性的值
写法:通过系统装饰器@特性名.setter
声明函数
@r.setter
def r(self, num):
if type(num) is int:
self._r = num
else:
print('请设置整数值')
cir.r = 20
删除器作用及写法
作用:通过del删除某个特性时,如果定义了删除器,该操作会执行删除其中的代码
写法:通过系统装饰器@特性名.deleter
声明函数
@r.deleter
def r(self):
print('can not delete')
del cir.r # 不加删除器会报错:AttributeError: can't delete attribute
属性私有化
让当前类的私有属性不会被子类继承到
Python中私有化机制:是属性名改写。在所有需要私有化的属性前添加__
,则该属性名就会变成:_类名__属性名
class Student:
def __init__(self):
self.__name = '张三'
def say(self):
print('hello,我是' + self.__name)
stu = Student()
stu.say();
print(stu._Student__name)
# print(stu.name) 报错:AttributeError: 'Student' object has no attribute 'name'
继承
声明继承关系:在子类名后跟小括号,小括号里是要继承的父类名
注意:
1.在继承父类实例属性时,要先手动调用父类的init函数
继承关系中的init方法的执行逻辑:在子类没有实现init方法时,会触发父类中的init执行;如果子类实现了init,不会触发父类的init执行
2.在子类复写父类时,要先手动调用父类相应的方法
class A:
def __init__(self):
self.name = 'zhangsan'
print('我是父类的init')
def say(self):
print('我是父类')
# 声明继承关系:在子类名后跟小括号,小括号里是要继承的父类名
class B(A):
def __init__(self):
# 手动调用父类的init函数
A.__init__(self)
print('我是子类的init')
def bSay(self):
print('我是子类')
# 在子类中复写父类
def say(self):
A.say(self)
print('我是复写的新数据')
b = B()
print(b.name)