类的注意事项

1)命名规则
需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,
是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名。
 
有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,
但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,
但是,请把我视为私有变量,不要随意访问”。
 
双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。
不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,
仍然可以通过_Student__name来访问__name变量:
 
>>> bart._Student__name
'Bart Simpson'
但是强烈建议你不要这么干,因为不同版本的Python解释器可能会把__name改成不同的变量名。
 
总的来说就是,Python本身没有任何机制阻止你干坏事,一切全靠自觉。
2)继承规则
子类将继承父类的所有属性和方法,初始化init方法时,也得初始化所以的属性
 

python继承

1)子类继承父类
    编写类时,并非总是要从空白开始。如果你要编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
2)子类的init方法
    创建子类的实例时,Python首先需要完成的任务是给父类的所有属性赋值。为此,子类的方法 __init__() 需要父类施以援手。
class Car():
"""一次模拟汽车的简单尝试"""
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0 def get_descriptive_name(self):
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title() def read_odometer(self):
print("This car has " + str(self.odometer_reading) + " miles on it.") def update_odometer(self, mileage):
if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:
print("You can't roll back an odometer!") def increment_odometer(self, miles):
self.odometer_reading += miles class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self, make, model, year):
"""初始化父类的属性"""
super().__init__(make, model, year) my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
3) python2中的继承
 
4)给子类定义属性和方法
让一个类继承另一个类后,可添加区分子类和父类所需的新属性和方法。下面来添加一个电动汽车特有的属性(电瓶),以及一个描述该属性的方法。我们将存储电
瓶容量,并编写一个打印电瓶描述的方法:
class Car():
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
-- snip --

class ElectricCar(Car):
"""Represent aspects of a car, specific to electric vehicles."""
def __init__(self, make, model, year):
"""
电动汽车的独特之处
初始化父类的属性,再初始化电动汽车特有的属性
"""
super().__init__(make, model, year)
self.battery_size = 70 # 1处 def describe_battery(self): # 2处
"""打印一条描述电瓶容量的消息"""
print("This car has a " + str(self.battery_size) + "-kWh battery.")
如果子类继承父类时,需要用到父类的属性或者方法,那么就需要调用父类的init方法

class Thread:
"""
xx1, xx2
"""
def __init__(self, xx1, xx2):
self.xx1 = xx1
self.xx2 = xx2 ​
class MyThread(Thread):
def __init__(self, xx1, xx2):
super().__init__(xx1, xx2) # 等价于super(MyThread, self).__init__()
self.xx3 = "新增的属性3"
self.xx4 = "新增的属性4"

 

5)重写父类的方法
对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。为此,可在子类中定义一个这样的方法,即它与要重写的父类方法同名。这样,Python将不会考虑这个父类方
法,而只关注你在子类中定义的相应方法。
假设 Car 类有一个名为 fill_gas_tank() 的方法,它对全电动汽车来说毫无意义,因此你可能想重写它。下面演示了一种重写方式:
class ElectricCar(Car):
-- snip --
def fill_gas_tank():
"""电动汽车没有油箱"""
print("This car doesn't need a gas tank!")
例二, 子类必须全部显性的继承,并实现父类的属性

class Father:
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex

def say(self):
print("父亲会说话,我叫%s, 我的年龄是%d, 我的性别是%s" % (self.name, self.age, self.sex))


class Child(Father):
def __init__(self, name, age, sex, grade, play):
super().__init__(name, age, sex)
self.grade = grade
self.play = play

def say(self):
print("孩子也会说话,我叫%s, 我的年龄是%d, 我的性别是%s, 我读%s, 我会玩%s" % (self.name, self.age, self.sex,
self.grade, self.play))
例三,子类可以隐形的继承父类的属性
class Father:
def __init__(self, name='', age=0, sex=''):
self.name = name
self.age = age
self.sex = sex

def say(self):
print("父亲会说话,我叫%s, 我的年龄是%d, 我的性别是%s" % (self.name, self.age, self.sex))


class Child(Father):
def __init__(self, grade, play):
super().__init__()
self.grade = grade
self.play = play

def say(self):
print("孩子也会说话,我叫%s, 我的年龄是%d, 我的性别是%s, 我读%s, 我会玩%s" % (self.name, self.age, self.sex,
self.grade, self.play))
if __name__ == '__main__':
C = Child('二年级', 'play games')
C.say()

"""
孩子也会说话,我叫, 我的年龄是0, 我的性别是, 我读二年级, 我会玩play games
"""
例四:
 
class Father:
def __init__(self, name='', age=0, sex=''):
self.name = name
self.age = age
self.sex = sex

def say(self):
print("父亲会说话,我叫%s, 我的年龄是%d, 我的性别是%s" % (self.name, self.age, self.sex))


class Child(Father):
def __init__(self, grade, play):
super().__init__()
self.grade = grade
self.play = play

def say(self):
print("孩子也会说话,我叫%s, 我的年龄是%d, 我的性别是%s, 我读%s, 我会玩%s" % (self.name, self.age, self.sex,
self.grade, self.play))


if __name__ == '__main__':
C = Child('二年级', 'play games')
C.name = '小明'
C.age = 12
C.sex = 'boy'
C.say()
# 孩子也会说话,我叫小明, 我的年龄是12, 我的性别是boy, 我读二年级, 我会玩play games

  

学习Python类的心得的更多相关文章

  1. 学习python类

    类:Python 类提供了面向对象编程的所有基本特征: 允许多继承的类继承机制, 派生类可以重写它父类的任何方法, 一个方法可以调用父类中重名的方法. 对象可以包含任意数量和类型的数据成员. 作为模块 ...

  2. 重新学习python类

    之前觉得有java和c++的底子,对python的类没有认真研习,后面到了写项目的时候各种懵逼.终于决定彻底解决python的类问题. 一.python的类定义: class cls_name: de ...

  3. 关于学习Python的一些心得

    1.关注函数参数的类型,如列表,字符串,int,而不是关注函数的功能 2.导入模块numpy,dir(numpy) 查看所有属性 3.''.join(列表)  将列表拆成字符串

  4. python学习的一点点心得

    好久没发博客了,不解释....接下来写一点自己最近学习python的一点心得. 想要学习python的初衷,是看<软件测试技术大全>一书时,了解到像perl.python.ruby等脚本类 ...

  5. Python学习:类和实例

    Python学习:类和实例 本文作者: 玄魂工作室--热热的蚂蚁 类,在学习面向对象我们可以把类当成一种规范,这个思想就我个人的体会,感觉很重要,除了封装的功能外,类作为一种规范,我们自己可以定制的规 ...

  6. python类学习以及mro--多继承属性查找机制

    版权声明:本文为博主原创文章,未经博主允许不得转载. 还记得什么是新式类和旧式类吗? Python中,一个class继承于object,或其bases class里面任意一个继承于object,这个c ...

  7. 《python基础教程(第二版)》学习笔记 类和对象(第7章)

    <python基础教程(第二版)>学习笔记 类和对象(第7章) 定义类class Person:    def setName(self,name):        self.name=n ...

  8. 零基础入门学习Python(36)--类和对象:给大家介绍对象

    知识点 Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前 ...

  9. Python 类学习的一些Tips

    这里不详细介绍类,只总结一些小萌新在学习python 类时会有的一些疑点. 类的私有性 在python中,属性和方法的访问权限只有两种,公开的,和私有的.在给属性命名时用两个“__”下划线作为开头,就 ...

随机推荐

  1. JavaScript--自定义事件Event

    在开发过程中,js原生事件不足以满意开发需求,需要开发者自定义事件. 一.Event Event()构造函数创建一个新的Event. event = new Event(typeArg,eventIn ...

  2. 小程序tabBar的使用

    这个selectedIconPath一定要写,否则选中的那个图片是不会显示的 下面是不写的现象: onTabItemTap的使用---下面的现象说明:只有tab值向哪个页面才会触发.

  3. Android数据绑定DataBinding(二)入门篇

    前言 之前写了Android数据绑定DataBinding(一)入门篇,很简单的记录了如何使用DataBinding,其初衷是想要代码中的数据发生改变,不需要繁琐的setText等操作,在最后说到了只 ...

  4. [RK3288] 外接USB设备出现丢数

    CPU:RK3288 系统:Android 5.1 主板外接 USB 接口的外设,经常会出现丢数的现象,这种问题在很多 USB 接口的外设上都遇到过,例如:USB读卡器.USB扫描枪等 有一个共同点是 ...

  5. 使用docker运行mysql

    以前开发的时候都是用本地的sqlite开发,但是极少数情况下,sqlite支持的语法发布到服务器上链接mysql会报错. 为了避免这种现象,还是链接本地mysql开发还是更稳定的, 可是开发的项目多了 ...

  6. SQL-W3School-函数:SQL SUM() 函数

    ylbtech-SQL-W3School-函数:SQL SUM() 函数 1.返回顶部 1. SUM() 函数 SUM 函数返回数值列的总数(总额). SQL SUM() 语法 SELECT SUM( ...

  7. xss绕过姿势

    #未完待续... 00x1.绕过 magic_quotes_gpc magic_quotes_gpc=ON 是php中的安全设置,开启后会把一些特殊字符进行轮换, 比如: ' 会被转换为 \' 再比如 ...

  8. 简易的CRM系统案例之Struts2&Spring整合+Hibernate3+JSP+MySQL版本

    主要对上一篇Struts2&Spring整合的改造 简易的CRM系统案例之Struts2+Hibernate3+JSP+MySQL版本 src/bean.xml <beans xmlns ...

  9. python小白之数组索引

    索引 numpy中的数组索引形式和Python是一致的.如: np.arange(10) print x[2]  #单个元素,从前往后正向索引.注意下标是从0开始的. print x[-2]  #从后 ...

  10. 解决 MYSQL CPU 占用 100% 的经验总结

    朋友主机(Windows 2003 + IIS + PHP + MYSQL )近来 MySQL 服务进程 (mysqld-nt.exe) CPU 占用率总为 100% 高居不下.此主机有10个左右的 ...