1、私有属性和私有方法
1、 私有属性与私有方法不能从外部被调用,也不会被子类继承
2、在属性或方法的前面加上__,就变成了私有属性或私有方法,如果前后都有__,不是私有属性或私有方法
3、 私有属性和私有方法,实例对象直接调用会报错,只有当前类自己才可以使用
class ClsstestA:
__str1 = 'ABC'
str2 = 'DEF'
def __init__(self):
pass
def __method1(self):
print('这是一个私有方法')
def method2(self):
print(self.__str1) # 调用私有属性
self.__method1() # 调用私有方法
cls1 = ClsstestA()
cls1.method2()
# 输出结果:
# ABC
# 这是一个私有方法
# print(cls1.__str1) # 私有属性,实例对象直接调用会报错
# print(cls1.__method1()) #私有方法,实例对象直接调用会报错
2、object类
# 所有的类都是object的子类,一个类无论是否声明继承object,实际都继承object类
class Class2:
"""
这是类的注释
"""
# Class2继承了object,所以可以直接使用object里提供的属性或方法
print(Class2.__dict__) # 显示类的属性 # 输出结果:返回了一个查看对象内部所有属性名和属性值组成的字典
print(Class2.__doc__) # 显示类的注释 # 输出结果:这是类的注释
print(Class2.__base__) # 显示第一继承父类的名称 # 输出结果:<class 'object'>
print(Class2.__bases__) # 显示所有父类,爷类,祖宗十八代类的名称 # 输出结果:(<class 'object'>,)
print(Class2.__name__) # 显示类的名称 # 输出结果:Class2
3、多继承,一个类可以有多个父类
1、 继承多个父类时,用逗号隔开
2、 继承的多个父类中有同名方法时,按照继承顺序考前的父类中的同名方法进行调用
class Money1:
def money(self):
print('一个亿')
class Money2:
def money(self):
print('两个亿')
def countmoney(self):
print('我有很多钱')
class Human(Money1, Money2): # 继承多个父类时,用逗号隔开,多个父类中有同名方法时,按照继承顺序进行调用
pass
man = Human()
man.money() # 输出结果:一个亿
man.countmoney() # 输出结果:我有很多钱
4、多态
1、面向对象的3大特征,封装,继承,多态
2、代码中:def animal_say(obj):中的obj作为形参时
3、当object作为参数传值时,你可以用任意类型作为参数传进去,这个体现了多态的性质。不管是int类型还是str类型或者是自己自定义的类型的对象都可以作为参数传进去。
class Dog:
def say(self):
print('汪汪汪')
class Cat:
def say(self):
print('喵喵喵')
# 当object作为参数传值时,你可以用任意类型作为参数传进去,这个体现了多态的性质。不管是int类型还是str类型或者是自己自定义的类型的对象都可以作为参数传进去。
def animal_say(obj):
obj.say()
dog = Dog() # 狗的实例
cat = Cat() # 猫的实例
animal_say(cat) # 传猫的对象,想让猫叫
# 输出结果:喵喵喵
animal_say(dog) # 传狗的对象,想让狗叫
# 输出结果:汪汪汪
# 练习:写一个三角形的类
class Sanjiaoxing:
def __init__(self, a, b, c):
self.a = a
self.b = b
self.c = c
def zhouchang(self):
if self.a + self.b <= self.c or self.a + self.c <= self.b or self.b + self.c <= self.a:
return '无法构成三角形,忽略周长'
else:
return self.a + self.b + self.c
def mianji(self):
if self.a + self.b <= self.c or self.a + self.c <= self.b or self.b + self.c <= self.a:
return '无法构成三角形,忽略面积'
else:
p = (self.a + self.b + self.c) / 2
return (p * (p - self.a) * (p - self.b) * (p - self.c)) ** 0.5
sjx = Sanjiaoxing(3, 4, 5)
print(sjx.zhouchang())
# 输出结果:12
print(sjx.mianji())
# 输出结果:6.0