Python面向对象编程

99 阅读3分钟

                                                                        Python面向对象编程

1、类和实例:类关键字 class;方法/函数 关键字 def
(1)、类:[ class 类名(object) ]
方法:[ def 方法名(self) ]
有的时候new一个类的时候要给变量绑定属性,就要用到 __init__ 了,注意是[2个][_]
就是对实例初始化,构造函数
代码:
class Cat(object):
def __init__(self, name, age):
self.name = name
self.age = age
注意:object 和 self 是不能省略的。
(2)、数据封装,类的变量和方法的调用
代码:
class Cat(object):
hobby = 'eat'
def __init__(self, name, age):
self.name = name
self.age = age

def info(self):
print('cat name is',self.name,'; cat age is',self.age)

catObj = Cat('xiaoxiao', 11)
print(catObj.hobby)
catObj.info()
打印:
eat
cat name is xiaoxiao ; cat age is 11

2、访问限制
(1)、要让外部不能访问类的内部属性,类的属性要为私有,只要在属性前面加上两个下划线__就可以了
代码:
class Cat(object):
hobby = 'eat'
def __init__(self, name, age):
self.__name = name
self.__age = age

def info(self):
print('cat name is',self.name,'; cat age is',self.age)

catObj = Cat('xiaoxiao', 11)
print(catObj.hobby)
catObj.info()
打印:
eat
Traceback (most recent call last):
File ".\a.py", line 12, in <module>
catObj.info()
File ".\a.py", line 8, in info
print('cat name is',self.name,'; cat age is',self.age)
AttributeError: 'Cat' object has no attribute 'name'
(2)、如果要获取私有属性
def getname(self):
return self.__name
(3)、如果要修改私有属性
def setname(self, name):
self.__name = name


3、继承和多态
(1)、继承:子类获得了父类的全部功能
代码:
class Cat(object):
hobby = 'eat'
def __init__(self, name, age):
self.name = name
self.age = age

def info(self):
print('cat name is',self.name,'; cat age is',self.age)


class Xiaoxiao(Cat):
pass


xiao = Xiaoxiao('xiaoxiao', 12)
print(xiao.hobby)
xiao.info()
打印:
eat
cat name is xiaoxiao ; cat age is 12
注意:如果子类调用一个方法:子类,父类中都存在。那么执行的是子类中的方法。
(2)、多态
代码:
class Cat(object):
def info(self):
print('I am Cat')


class Redcat(Cat):
def info(self):
print('I am red')

class Bluecat(Cat):
def info(self):
print('I am blue')

#把实例当成类型传输
def duotai(cat):
cat.info()

duotai(Cat())
duotai(Redcat())
duotai(Bluecat())
注意:
duotai()方法接收一个cat类型,由于Cat类型有info()方法,因此,传入的任意类型,只要是Cat类或者子类,就会自动调用实际类型的info()方法,这就是多态的意思。
对于一个变量,我们只知道它是cat类型,无需知道它确切的子类型,就调用info()方法,而info()方法真正作用在哪个对象上,由运行时该对象的确切类型决定。

4、获取对象信息
(1)、当我们拿到一个对象,需要知道它的类型,怎么获取。
(1)、使用 type()方法
代码:
class Cat(object):
def info(self):
print('I am Cat')

cat = Cat()
print(type(cat))
print(type('sdsf'))
print(type(314))
打印:
<class '__main__.Cat'>
<class 'str'>
<class 'int'>
注意:
如果一个变量指向函数或者类,也能用type()判断

(2)、使用 isinstance()
1)、判断对象是否是某种类型
代码:
c = Cat()
print(isinstance(c,Cat))
打印:
True
2)、判断变量是否是[某些类型]的一种
代码:
listArr = [3, 1, 4]
tupleArr = (3, 1, 4)
isList = isinstance( listArr, (list, tuple) )
isTuple = isinstance( tupleArr, (list, tuple) )
print(isList)
print(isTuple)
打印:
True
True
(3)、使用dir():如果要获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list,比如,获得一个str对象的所有属性和方法。
代码:
class Cat(object):
hobby = 'eat'
def __init__(self, name, age):
self.name = name
self.age = age

def info(self):
print('cat name is',self.name,'; cat age is',self.age)

c = Cat('eee', 314)
print(dir(c))
打印:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get
attribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__',
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__', '__weakref__', 'age', 'hobby', 'info', 'name']

5、实例属性和类属性
代码:
class Cat(object):
hobby = 'eat'

c = Cat()
print(c.hobby)  #实例属性不存在,打印类属性
c.hobby = 'instance' #给实例属性赋值
print(c.hobby)  #实例属性存在,打印实例属性
del c.hobby     #删除实例属性
print(c.hobby)  #删除后实例属性不存在,打印类属性
打印:
eat
instance
eat
注意:
实例属性和类属性最好不要使用相同的名字,
相同名称的实例属性将屏蔽掉类属性,
当你删除实例属性后,实例访问到的将是类属性。