python学习-基础-面向对象编程

面向对象编程

1.# 类是抽象的模板

class Student(object): #object表示从哪个类继承的,没有继承类就使用object
	"""docstring for Student"""
	# 初始化必需属性,第一个参数永远是self
	# 有了__init__方法,在创建实例的时候,就不能传入空的参数了
	def __init__(self, name, score):
		super(Student, self).__init__()
		# 实例变量前加__ 就是private变量,只能内部访问, 约定加_ 也为私有变量, 但实际外部可以访问,一切靠自觉
		# #不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,
		# 所以,仍然可以通过_Student__name来访问__name变量,但是不同版本的Python解释器可能会把__name改成不同的变量名
		self.__name = name 
		
		self.__score = score
		self.__sp__ = '123' # 实例变量前后都加__ 为特殊变量,外部可以访问
		# 第一个参数是self
	def print_score(self):
		print('%s: %s' % (self.__name, self.__score))

	def get_grade (self):
		if self.score >= 90:
			return 'A'
		elif self.score >= 60:
			return 'B'
		else:
			return 'C'
	# 访问内部属性
	def get_name(self):
		return self.__name
	# 修改内部属性
	def set_name (self, name):
		if not isinstance(name, str):
			ErrorType('type error', name)
			return
		self.__name = name
bart = Student('Bart Simpson', 59)
lisa = Student('Lisa Simpson', 87)
bart.print_score()
lisa.print_score()

print(bart.get_name())
bart.set_name('Jone')
print(bart.get_name())

2.# 继承

class Animal(object):
	"""docstring for Animal"""
	def __init__(self, ):
		super(Animal, self).__init__()
		# self.arg = arg
	def run (self):
		print('run run run ....')

class Cats(Animal):
	"""docstring for Cats"""
	def run(self):
		print('Cat is running...')

		
class Dogs(Animal):
	"""docstring for Dogs"""
	def __init__(self):
		super(Dogs, self).__init__()
		self.__name__ = 'dog'
		self.age = 10

	def eat (self):
		print(self.__name__ + ' eating meat...')
		
dog = Dogs()
dog.eat()

3.# 判断对象类型,有哪些方法 type()

# 判断对象类型,有哪些方法 type()
print(type(123)) # int
type(123)==int # True
type('abc')==str # True
type('abc')==type(123) # False
# 判断具体类型可以用 str int 但如果要判断一个对象是否是函数怎么办?可以使用types模块中定义的常量:
import types
print(type(abs) == types.BuiltinFunctionType)

# isinstance() 总是优先使用isinstance()判断类型,可以将指定类型及其子类“一网打尽”。
# isinstance判断继承关系 
print(isinstance(dog, Dogs))
print(isinstance(dog, Animal))
print(isinstance(dog, Dogs) and isinstance(dog, Animal))

# isinstance 判断类型
isinstance('a', str)
isinstance(123, int)
isinstance(b'a', bytes)
# isinstance 判断一个变量是否是某些类型中的一种
isinstance([1, 2, 3], (list, tuple))
isinstance((1, 2, 3), (list, tuple))

# dir() 获得一个对象的所有属性和方法,可以使用dir()函数 返回一个包含字符串的list
# print(dir('AB'))
# ['__add__', '__class__',..., '__subclasshook__', 'capitalize', 'casefold',..., 'zfill']
# 
# 配合getattr()、setattr()以及hasattr(),我们可以直接操作一个对象的状态:
# 只有在不知道对象信息的时候,我们才会去获取对象信息
print(hasattr(dog, '__name__')) # 判断对象属性是否存在
print(hasattr(dog, 'age'))
setattr(dog, 'y', 19) # 设置新属性
print(hasattr(dog, 'y')) # True
print(getattr(dog, 'y', 404)) # 19 如果不存在,会报错,可以添加第三个参数,返回默认值

print(hasattr(dog, 'run')) # 判断对象方法是否存在

# 正确用法  首先要判断该fp对象是否存在read方法,如果存在,则该对象是一个流,如果不存在,则无法读取
def readImage(fp):
    if hasattr(fp, 'read'):
        return readData(fp)
    return None

  1. #实例属性和类属性

 # 在编写程序的时候,千万不要对实例属性和类属性使用相同的名字
 # ,因为相同名称的实例属性将屏蔽掉类属性,但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性
class Student1(object):
    name = 'Student' # 这种属性为类属性,类的所有实例都可以访问,相当于public
	count = 0
	def __init__(self, age):
        self.name = age
        Student.count += 1 # 每实例化一次,次数增加1次

猜你喜欢

转载自blog.csdn.net/u011342216/article/details/86082777
今日推荐